VIPS 没有破坏性操作:只能构建新镜像,不能修改现有镜像。这个限制就是为什么 vips 可以做诸如自动并行化和操作缓存之类的事情。
在幕后,它有一些额外的机制来降低效率。你可以像这样解决你的问题:
#!/usr/bin/python
import sys
import random
from gi.repository import Vips
# make vips leaktest itself .. this also reports a memory high-water mark
# you'll get a small speedup if you comment this out
Vips.leak_set(True)
composite = Vips.Image.black(10000, 10000)
for filename in sys.argv[1:]:
tile = Vips.Image.new_from_file(filename, access = Vips.Access.SEQUENTIAL)
x = random.randint(0, 10000)
y = random.randint(0, 10000)
composite = composite.insert(tile, x, y)
composite.write_to_file("output.tif")
这里有一个所有 vips 操作员的可搜索列表:
http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/func-list.html
插入的文档在这里:
http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/libvips-conversion.html#vips-insert
尽管您似乎在为每次迭代制作一个新的(巨大的)图像,但实际上在您背后的 vips 将共享图像并且只创建它需要的位。此外,在 open 上设置“顺序”提示意味着 vips 可以在写入最终 tiff 时将子图像流式传输。
像这样运行:
$ time ./insert.py ~/pics/k*.jpg
memory: high-water mark 53.81 MB
real 0m1.913s
user 0m0.939s
sys 0m0.266s
$ ls ~/pics/k*.jpg | wc
8 8 278
那是粘贴在 8 个大 jpg 图像中。报告的内存使用用于像素缓冲区,它不包括所有内存。如果您尝试粘贴 RGB 和 RGBA 图像的混合,此脚本将中断,您需要添加一些东西来处理 Alpha 通道。
(其实有一个破坏性的粘贴操作:
http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/libvips-draw.html#vips-draw-image
它适用于真正需要修改图像的paintbox风格的程序,它并不适合一般用途)