0

我想使用 VIPS 将许多较小图像的目录附加到一个大图像中。节点模块“sharp”使用 libvips。有没有办法使用Sharp将2张图像附加在一起?VIPS 有一个“LRJOIN”功能,但我没有看到它的清晰实现。

我真的只是想知道让 VIPS 将图像目录附加到一个大 TIFF 的最快方法。由于内存问题,图像太大而无法使用 ImageMagick 等。

编辑:

我使用 ruby​​-vips 加入图像并调用 VIPS 命令行工具生成 DZI。

#!/usr/bin/ruby

require 'rubygems'
require 'vips'

a = VIPS::Image.new(ARGV[1])
ARGV[2..-1].each {|name| a = a.tbjoin(VIPS::Image.tiff(name, :compression => :deflated))}                              
a.write("output.tiff", :compression => :deflated)

system("vips dzsave output.tiff '#{ARGV[0]}'/output_dz.zip --overlap=0 --suffix=.jpg")

我在一个 ruby​​-sharp github 问题上找到了代码并对其进行了一些修改。550 个 4096x256 图像的结果(只是连接部分):

real    0m17.283s
user    0m47.045s
sys     0m2.139s
4

1 回答 1

0

如果 Ruby 或 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):
    return Vips.Image.new_from_file(filename,
                                    access = Vips.Access.SEQUENTIAL_UNBUFFERED)

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])

在此桌面上加入 100 个 2000x2500 rgb tif 图像需要 1gb 内存和 30s 左右:

$ time ../join.py x.tif *.tif
real    0m36.255s
user    0m8.344s
sys 0m3.396s
$ vipsheader x.tif 
x.tif: 204950x2500 uchar, 3 bands, srgb, tiffload

大部分时间显然都花在了磁盘 IO 上。

于 2015-07-14T12:16:02.190 回答