Ich versuche, ein JPEG-Bild in Go mit mozjpeg zu komprimieren. Da es keine offizielle Go-Bindung gibt, denke ich, ich werde einfach seine CLI aufrufen, um die Komprimierung durchzuführen.Wie wickle ich exec.Command innerhalb eines io.Writer
Ich versuche, die Nutzung nach compress/gzip
zu modellieren:
c := jpeg.NewCompresser(destFile)
_, err := io.Copy(c, srcFile)
Nun ist die Frage, wie kann ich die CLI innerhalb Compresser wickeln, damit es diese Verwendung unterstützen kann?
habe ich versucht, so etwas wie dieses:
type Compresser struct {
cmd exec.Command
}
func NewCompressor(w io.Writer) *Compresser {
cmd := exec.Command("jpegtran", "-copy", "none")
cmd.Stdout = w
c := &Compresser{cmd}
return c
}
func (c *Compresser) Write(p []byte) (n int, err error) {
if c.cmd.Process == nil {
err = c.cmd.Start()
if err != nil {
return
}
}
// How do I write p into c.cmd.Stdin?
}
Aber könnte es nicht beenden.
Auch eine zweite Frage ist, wann schließe ich den Befehl? Wie man den Befehl herunterfährt?