2017-10-18 6 views
0

少しヒントが必要です。 Goで画像のサムネイルを作成していて、それらをjpegoptimに渡して破砕したいと思います。image.RGBAからio.Readerを実装

jpegoptimには--stdinフラグと--stdoutフラグがありますが、これは使いたいものです。今、私は生成されたイメージを最初にディスクに保存するのではなく、私の* image.RGBAをio.Readerを実装するものに変換し、exec.Cmd.Stdinに渡すことができます。

私は誰かが私を正しい方向に向けることができれば、これを達成する方法はほとんど失われません。

おかげでこの場合

+2

イメージを何らかの形式でエンコードする必要があります。 jpegが必要な場合は、jpegパッケージを見てください。https://golang.org/pkg/image/jpeg/#Encode – JimB

+0

ありがとう@JimBたとえば、私はbytes.Bufferにエンコードして、それを直接使うことができますそれはio.Readerも実装しているので、右か? – tsdtsdtsd

答えて

1

は、あなた自身のio.Readerを実装する必要はありません。 io.Pipejpeg.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 
} 
関連する問題