Go 从image.RGBA实现io.Reader

Go 从image.RGBA实现io.Reader,go,jpegoptim,Go,Jpegoptim,我需要一点提示。我正在Go中创建图像的缩略图,并希望将其传递给jpegoptim进行粉碎 jpegoptim有--stdin和--stdout标志,我想使用它们。现在,我不想首先将生成的映像保存到磁盘,而是将我的*image.RGBA转换为实现io.Reader的内容,以便将其传递给exec.Cmd.Stdin 我对如何实现这一目标有些迷茫,如果有人能给我指出正确的方向,那就太好了 谢谢在这种情况下,您不需要实现自己的io.Reader。使用和,例如 func main(){ //准备图像。。。

我需要一点提示。我正在Go中创建图像的缩略图,并希望将其传递给jpegoptim进行粉碎

jpegoptim有--stdin和--stdout标志,我想使用它们。现在,我不想首先将生成的映像保存到磁盘,而是将我的*image.RGBA转换为实现io.Reader的内容,以便将其传递给exec.Cmd.Stdin

我对如何实现这一目标有些迷茫,如果有人能给我指出正确的方向,那就太好了


谢谢

在这种情况下,您不需要实现自己的
io.Reader
。使用和,例如

func main(){
//准备图像。。。
img:=。。。
//准备输出(文件等)。。。
输出文件:=。。。
//使用管道将JPEG编码器输出连接到cmd的标准输入
pr,pw:=io.Pipe()
//goroutine中的execjpegoptim
完成:=制造(chan bool,1)
go func(){
//执行命令
cmdErr:=字节.缓冲区{}
cmd:=exec.Command(“jpegoptim”、“--stdin”、“--verbose”)
cmd.Stdin=pr//从管道输入的图像
cmd.Stderr=&cmdErr//message
cmd.Stdout=outFile//优化图像输出
如果错误:=cmd.Run();错误!=nil{
//处理错误
}
fmt.Printf(“结果:%s\n”,cmdErr.String())
结束(完成)
}()
//将图像编码为JPEG,然后写入管道
o:=jpeg.Options{Quality:90}
jpeg.编码(pw、img和o)
//完成后,关闭管道
如果错误:=pw.Close();错误!=nil{
//处理错误
}
//等待jpegoptim

在这种情况下,您不需要实现自己的
io.Reader

func main(){
//准备图像。。。
img:=。。。
//准备输出(文件等)。。。
输出文件:=。。。
//使用管道将JPEG编码器输出连接到cmd的标准输入
pr,pw:=io.Pipe()
//goroutine中的execjpegoptim
完成:=制造(chan bool,1)
go func(){
//执行命令
cmdErr:=字节.缓冲区{}
cmd:=exec.Command(“jpegoptim”、“--stdin”、“--verbose”)
cmd.Stdin=pr//从管道输入的图像
cmd.Stderr=&cmdErr//message
cmd.Stdout=outFile//优化图像输出
如果错误:=cmd.Run();错误!=nil{
//处理错误
}
fmt.Printf(“结果:%s\n”,cmdErr.String())
结束(完成)
}()
//将图像编码为JPEG,然后写入管道
o:=jpeg.Options{Quality:90}
jpeg.编码(pw、img和o)
//完成后,关闭管道
如果错误:=pw.Close();错误!=nil{
//处理错误
}
//等待jpegoptim

您需要将图像编码为某种格式。如果您想要jpeg,请查看jpeg包:谢谢@JimB,例如,我将其编码为bytes.Buffer,并且可以直接使用它,因为它还实现io.Reader,对吗?您需要将图像编码为某种格式。如果您想要jpeg,请查看jpeg包:谢谢@JimB,例如e、 我将其编码为bytes.Buffer,可以直接使用它,因为它还实现了io.Reader,对吗?
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
}