Реализовать io.Reader из image.RGBA
Мне нужно немного намека. Я создаю эскизы изображений в Go и хотел бы передать их в jpegoptim для дробления.
У jpegoptim есть флаги --stdin и --stdout, которые я хотел бы использовать. Теперь я не хочу сначала сохранять сгенерированное изображение на диск, но конвертирую мой *image.RGBA во что-то, что реализует io.Reader, чтобы я мог передать его в exec.Cmd.Stdin
Я немного растерялся от того, как я мог бы достичь этого, было бы здорово, если бы кто-то указал мне правильное направление.
Спасибо
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
}