在 Windows 中将 libvips CLI 输出通过管道传输到标准输出

Pipe libvips CLI output to stdout in Windows

我正在使用 Windows libvips CLI 将图像从 HEIC 格式转换为 PNG 格式。我想将转换后的输出通过管道传输到另一个进程而不写入磁盘。这可以通过写入 stdout 来实现(即只输入文件扩展名作为输出文件):

vips copy input.heic .png

但是,如果我改为写入文件:

vips copy input.heic output.png

比较stdout字节流和output.png的内容,还是有些区别的。实际上,将 stdout 写入文件会导致 PNG 损坏。

进一步分析让我意识到 stdoutoutput.png 之间的区别是 stdout 中随机放置的大量 CR 个字符,这些字符不存在于 stdout文件。其他都是一样的。

有什么方法可以在 stdout 中获取从 output.png 读取的正确字节流吗?

看起来你遇到了一个错误 --- Windows 在文本模式下创建 stdin 和 stdout,所以当 libvips 写入 stdout 时,任何换行符将自动扩展为换行符 + 回车 return.

When 运行 on win, libvips 可能需要在写入图像数据之前调用_setmode(1, O_BINARY);强制二进制模式。我已经为 libvips 8.10 推送了一个补丁并感谢你。此修复将在 8.10.3 中进行,一两周后发布。