我正在编写一个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,比现在更多。
答案 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)
答案 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
。它仅适用于小文件。