在 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 损坏。
进一步分析让我意识到 stdout
和 output.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 中进行,一两周后发布。
我正在使用 Windows libvips
CLI 将图像从 HEIC
格式转换为 PNG
格式。我想将转换后的输出通过管道传输到另一个进程而不写入磁盘。这可以通过写入 stdout
来实现(即只输入文件扩展名作为输出文件):
vips copy input.heic .png
但是,如果我改为写入文件:
vips copy input.heic output.png
比较stdout
字节流和output.png
的内容,还是有些区别的。实际上,将 stdout
写入文件会导致 PNG 损坏。
进一步分析让我意识到 stdout
和 output.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 中进行,一两周后发布。