如何在`vips`工具中将图像转换为RGBA?如何确保两个图像具有相同数量的波段?

时间:2015-09-01 17:21:36

标签: image vips

我正在编写一个shell脚本来连接一些图像,我正在使用vips命令行,因为它的内存要求很低(我打算使用非常大的图像)。

但是,如果一个图像是RGB而另一个图像是RGBA,则它会失败:

$ vips insert foo3.png foo4.png foo.png 64 0 --expand --background '0 0 0 0'
insert: images must have the same number of bands, or one must be single-band

$ file foo?.png
foo3.png: PNG image data, 1 x 1, 8-bit/color RGB, non-interlaced
foo4.png: PNG image data, 1 x 1, 8-bit/color RGBA, non-interlaced

使用vips时,如何将输入图像转换为RGBA?我一直在搜索文档,但我找不到它。

我也愿意使用nip2工具,它也使用libvips。我不愿意使用ImageMagick(或类似的工具),因为脚本最终会处理大小为20k×20k像素的图像,这需要几GB的RAM,比现在更多。

3 个答案:

答案 0 :(得分:1)

不幸的是,你can't really do it in one step from the command-line with vips。您需要使用其中一个绑定(C / C ++,nip2,Ruby,Python)并将多个操作连接在一起。

suggest Python。你可以这样做:

#!/usr/bin/python

import sys
from gi.repository import Vips

if len(sys.argv) < 3:
    print("usage: join outfile in1 in2 in3 ...")
    sys.exit(1)

def imopen(filename):
    im = Vips.Image.new_from_file(filename,
                                  access = Vips.Access.SEQUENTIAL_UNBUFFERED)

    # add an alpha if this is plain RGB
    if im.bands == 3:
        im = im.bandjoin(255)

    return im

acc = imopen(sys.argv[2])
for infile in sys.argv[3:]:
    acc = acc.join(imopen(infile), Vips.Direction.HORIZONTAL,
                   align = "centre",
                   expand = True,
                   shim = 50,
                   background = 255)

acc.write_to_file(sys.argv[1])

在这台笔记本电脑(戴尔XPS-13)上,我看到了:

john@kiwi:~/try$ time ./join.py x.tif join/*.tif
real    0m10.902s
user    0m16.168s
sys 0m3.092s
john@kiwi:~/try$ vipsheader x.tif
x.tif: 204950x2500 uchar, 4 bands, srgb, tiffload

这是并排加入100个2500x2000 RGB tiffs制作一个巨大的条带。它运行在大约800MB的内存中。

如果可以,我会使用TIFF而不是PNG。 PNG非常慢。

答案 1 :(得分:1)

recent vips versions上:

vips bandjoin_const source.png dest.png "255"

255为opaque,0为透明。

答案 2 :(得分:0)

不是最佳解决方案,但作为解决方法,如果输入图像足够小:

convert "foo3.png" "png32:tmp.png"
vips insert tmp.png foo4.png foo.png 64 0 --expand --background '0 0 0 0'

基本上,我使用ImageMagick转换为临时RGBA文件,然后在该文件上使用vips。它仅适用于小文件。