Golang如何将图像写入标准输出

Golang如何将图像写入标准输出 我需要将图像写入标准输出,以便在Unix管道中使用,例如:

$ mycmd foo.jpg | cmd2 | cmd3

图像类型是 *image.NRGBA,我可以使用 Encode 函数将其成功写入文件,例如:

err := jpeg.Encode(fd, img, nil)

这工作正常,但如果我写入标准输出,例如:

err := jpeg.Encode(os.Stdout, img, nil)

生成的文件仅被识别为数据而不是jpeg,例如:

$ mycmd foo.jpg | file -

/dev/stdin: data

非常感谢任何帮助理解此问题,以便我能修复它。

此致,

D


更多关于Golang如何将图像写入标准输出的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

@nehakakar

你的解决方案完全奏效了,非常感谢!我之前没有意识到需要从 os.Stdout 创建一个新的 bufio 写入器。我原以为 os.Stdout 本身就已经是一个 bufio 写入器了。不管怎样,再次感谢,我真的很感激你的帮助。

更多关于Golang如何将图像写入标准输出的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在写入图像数据之前,请设置适当的 HTTP Content-Type 头部。

package main

import (
	"image"
	"image/jpeg"
	"os"
)

func main() {
	// 假设您已将图像存储在类型为 *image.NRGBA 的 `img` 变量中

	// 将 Content-Type 头部设置为 "image/jpeg"
	os.Stdout.Write([]byte("Content-Type: image/jpeg\n\n"))

	// 对图像进行编码并将其写入标准输出
	err := jpeg.Encode(os.Stdout, img, nil)
	if err != nil {
		// 处理错误
	}
}

在写入图像数据之前将 “Content-Type” 头部设置为 “image/jpeg”,您向管道的接收端表明正在传输的数据是 JPEG 格式。 采用这种方法,当您运行如下命令时:

$ mycmd foo.jpg | cmd2 | cmd3

管道中后续的命令(cmd2cmd3)会将 mycmd 的输出识别为 JPEG 图像。

祝一切顺利。

你可以直接使用 os.Stdout 作为 io.Writer 来写入图像数据。以下是示例代码:

package main

import (
    "image"
    "image/jpeg"
    "os"
)

func main() {
    // 假设 img 是你的 *image.NRGBA 图像
    var img image.Image // 替换为你的图像数据
    
    // 将图像以 JPEG 格式写入标准输出
    if err := jpeg.Encode(os.Stdout, img, nil); err != nil {
        panic(err)
    }
}

确保你的程序只输出图像数据,不要添加任何额外的日志或输出。例如,避免在图像数据前后使用 fmt.Println

如果你需要支持其他图像格式,可以使用相应的编码包,比如 image/png

import "image/png"

// 写入 PNG 格式
if err := png.Encode(os.Stdout, img); err != nil {
    panic(err)
}

检查你的程序是否在写入标准输出之前或之后打印了其他内容,这可能会破坏图像数据。

回到顶部