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
反復ごとに新しい (巨大な) イメージを作成しているように見えますが、実際には背後の vip がイメージを共有し、必要なビットのみを作成します。さらに、open で「シーケンシャル」ヒントを設定すると、最終的な tiff を書き込む際に、VIP がサブイメージをストリーミングできることを意味します。
次のように実行します。
$ 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 の画像を組み合わせて貼り付けようとすると壊れてしまいます。アルファ チャンネルを処理するために何かを追加する必要があります。
(実際には、破壊的な貼り付け操作があります。
http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/libvips-draw.html#vips-draw-image
実際に画像を変更する必要があるペイントボックス スタイルのプログラム用にあり、一般的な使用にはあまり適していません)。