我需要一点提示。我正在Go中创建图像的缩略图,并希望将它们传递给jpegoptim进行破碎。
jpegoptim有--stdin和--stdout标志,我想使用它。现在,我不想先将生成的图像保存到磁盘,而是将我的* image.RGBA转换为实现io.Reader的东西,所以我可以将它传递给exec.Cmd.Stdin
我对如何实现这一目标感到有点失落,如果有人能指出我正确的方向,那就太棒了。
由于
答案 0 :(得分:1)
在这种情况下,您不需要实施自己的io.Reader
。使用io.Pipe
和jpeg.Encode
,例如
func main() {
//Prepare image ...
img := ...
//Prepare output (file etc.) ...
outFile := ...
//Use pipe to connect JPEG encoder output to cmd's STDIN
pr, pw := io.Pipe()
//Exec jpegoptim in goroutine
done := make(chan bool, 1)
go func() {
//execute command
cmdErr := bytes.Buffer{}
cmd := exec.Command("jpegoptim", "--stdin", "--verbose")
cmd.Stdin = pr //image input from PIPE
cmd.Stderr = &cmdErr //message
cmd.Stdout = outFile //optimize image output
if err := cmd.Run(); err != nil {
// handle error
}
fmt.Printf("Result: %s\n", cmdErr.String())
close(done)
}()
//ENCODE image to JPEG then write to PIPE
o := jpeg.Options{Quality: 90}
jpeg.Encode(pw, img, &o)
//When done, close the PIPE
if err := pw.Close(); err != nil {
// handle error
}
//Wait for jpegoptim
<-done
}