【问题标题】:Pipe libvips CLI output to stdout in Windows在 Windows 中将 libvips CLI 输出通过管道传输到标准输出
【发布时间】:2020-11-25 23:59:27
【问题描述】:

我正在使用 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 中获取正确的字节流,因为它是从output.png 读取的?

【问题讨论】:

    标签: stdout image-conversion vips heic


    【解决方案1】:

    看起来你遇到了一个错误 --- Windows 在文本模式下创建标准输入和标准输出,所以当 libvips 写入标准输出时,任何换行符都会自动扩展为换行符 + 回车。

    在 win 上运行时,libvips 可能需要调用_setmode(1, O_BINARY); 来强制二进制模式,然后再写入图像数据。我已经向 libvips 8.10 推送了一个补丁并感谢您。此修复程序将在 8.10.3 中发布,一两周后到期。

    【讨论】:

    • 你完全正确。我已经在字节流中搜索了LF,并且前面总是有一个CR。作为一个临时补丁,我已经用LF 替换了所有那些CRLF,现在字节流匹配output.png 读取。谢谢!
    • 你也可以使用 python 之类的东西——你可以编写一个 5 行程序以二进制模式打开文件描述符并写入,这比更改所有 cr-lf 对更安全。示例代码:libvips.github.io/libvips/2019/11/29/…