Реализовать 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
}
Другие вопросы по тегам