0

我使用libvipsHEIC图像转换为更易于处理的格式并将结果通过管道传输到另一个进程而不写入磁盘。我可以使用PNG中间格式来做到这一点:

vips copy input.heic .png

然而,我链中的下一个过程只接受BMP图像或原始 RGB 数据。如果我在上面的命令中替换.png.bmp,我会收到此错误:

input.heic: bad seek to 1811903
VipsForeignSave: ".bmp" is not a known target format

这发生在许多其他格式中,包括本机.vips. 如果我写入磁盘而不是写入,则转换适用于所有格式stdout

它将有助于能够BMP使用 RGB 信息转换为整数列表或转换为整数列表。

4

2 回答 2

2

您可以使用 . 查看支持的格式集vips -l。对于 8.10,它是:

$ vips -l | grep _target
          VipsForeignSaveCsvTarget (csvsave_target), save image to csv (.csv), priority=0, mono
          VipsForeignSaveMatrixTarget (matrixsave_target), save image to matrix (.mat), priority=0, mono
          VipsForeignSavePpmTarget (ppmsave_target), save to ppm (.ppm, .pgm, .pbm, .pfm), priority=0, rgb
          VipsForeignSaveRadTarget (radsave_target), save image to Radiance target (.hdr), priority=0, rgb
          VipsForeignSavePngTarget (pngsave_target), save image to target as PNG (.png), priority=0, rgba
          VipsForeignSaveJpegTarget (jpegsave_target), save image to jpeg target (.jpg, .jpeg, .jpe), priority=0, rgb-cmyk
          VipsForeignSaveWebpTarget (webpsave_target), save image to webp target (.webp), priority=0, rgba-only
          VipsForeignSaveHeifTarget (heifsave_target), save image in HEIF format (.heic, .heif, .avif), priority=0, rgba-only

.v并且.raw可能会在 8.11 中添加。.bmp是由 imagemagick 而不是 libvips 编写的,可能无法成功。

另一种选择是使用 Python 接口pyvips之类的东西,而不是 CLI。例如:

import os
import pyvips

image = pyvips.Image.black(10, 10)
memory = image.write_to_memory()
os.write(1, memory)

将以二进制模式将原始字节(在本例中为 100 个零)写入标准输出。

要改用 BMP,您可以编写:

memory = image.magicksave_buffer(format="BMP")
于 2020-11-26T22:59:48.267 回答
1

不确定您是在寻找解决方法,还是希望 John 为 . 提供软件更新libvips,或者究竟是什么。

无论如何,我只想说,如果您想要将vips输出转换为 BMP 的解决方法,您可以使用ppmtobmpNetPBM 套件的一部分。

因此,对于一个文件,该文件将是:

vips copy image.heic .ppm | ppmtobmp - > result.bmp

并作为流过滤器,无需磁盘:

vips copy image.jpg .ppm | ppmtobmp | NextProcess

请注意,ppm格式实际上是 RGB,开头有 3-4 行 ASCII 标头,其中包含尺寸 - 试试看。所以,如果你能在 Windows 中找到删除 3-4 行 ASCII 的方法,你就可以得到 RGB。或者,如果您的图像是 3 字节/像素的 640x480 像素,也许您可​​以在 Windows 上找到一种方法来获取文件的最后(640x480x3)字节,或者以这种方式流式传输并丢弃 PPM 标头。

关键词:HEIC、vips、NetPBM、BMP

于 2020-11-27T13:56:48.983 回答