参考答案(如何将dzi(深度缩放(文件转换为完整图像(
我在这个话题上是个迷,如果我错了,请纠正。
我正在尝试从.dzi(深度缩放图像(格式创建一个多瓷砖tiff,我正在做的是:
(i( 选择最高级别文件夹。
(ii(将m行的所有n列(m_n.jpeg,我指的是以这种格式保存的图像(垂直缝合为png图像。因此,它们占据了相当大的空间。
(iii(最后,我使用pyvips将所有这些垂直png图像水平合并为一个完整的png图像。Image.write_to_file((.
(iv(最后使用vips im_save,我将完整的图像png转换为tiff。
我现在担心的是,这个过程需要将近2个小时才能为30000个base_tiles制作完整的图像png,而且它的大小达到10+GB(完整图像png(。
有没有更好更快的方法可以将.dzi转换为tiff?
libvips有一个arrayjoin
运算符,可以将一组瓦片连接到一个大图像中。
您可以这样使用它(在linux命令行上(:
vips arrayjoin "$(ls *.jpeg | sort -t_ -k2g -k1g)" x.tif[tile,pyramid,compression=jpeg] --across 20
这将加载当前目录中的所有JPG图像,将它们组装成一个巨大的网格,20个图像,并编写为TIFF金字塔。显然,您需要检查网格的大小,并调整across
参数。
$()
部分先按y,然后按数字顺序对形式x_y.jpeg
的文件名进行排序。如果没有这一点,瓷砖就会被调换,令人恼火。
这是假设重叠0。如果瓷砖有重叠,则需要设置hspacing
和vspacing
选项来控制瓷砖的定位方式。例如:
vips arrayjoin "$(ls *.jpg | sort -t_ -k2g -k1g)" x.tif --across 20 --hspacing 254 --vspacing 254
将在水平和垂直方向上每隔254个像素定位一次平铺。
这是一个行之有效的例子。首先,创建一个没有重叠的深度缩放金字塔:
john@kiwi:~/pics/x$ vips dzsave ~/pics/k2.jpg x --overlap 0
john@kiwi:~/pics/x$ cd x_files/11
john@kiwi:~/pics/x/x_files/11$ ls
0_0.jpeg 0_7.jpeg 1_5.jpeg 2_3.jpeg 3_1.jpeg 3_8.jpeg 4_6.jpeg 5_4.jpeg
0_1.jpeg 0_8.jpeg 1_6.jpeg 2_4.jpeg 3_2.jpeg 4_0.jpeg 4_7.jpeg 5_5.jpeg
0_2.jpeg 1_0.jpeg 1_7.jpeg 2_5.jpeg 3_3.jpeg 4_1.jpeg 4_8.jpeg 5_6.jpeg
0_3.jpeg 1_1.jpeg 1_8.jpeg 2_6.jpeg 3_4.jpeg 4_2.jpeg 5_0.jpeg 5_7.jpeg
0_4.jpeg 1_2.jpeg 2_0.jpeg 2_7.jpeg 3_5.jpeg 4_3.jpeg 5_1.jpeg 5_8.jpeg
0_5.jpeg 1_3.jpeg 2_1.jpeg 2_8.jpeg 3_6.jpeg 4_4.jpeg 5_2.jpeg
0_6.jpeg 1_4.jpeg 2_2.jpeg 3_0.jpeg 3_7.jpeg 4_5.jpeg 5_3.jpeg
你可以看到它是由6块瓷砖和9块瓷砖组成的网格。
现在重新组装瓦片并将其写入TIFF金字塔:
john@kiwi:~/pics/x/x_files/11$ vips arrayjoin "$(ls *.jpeg | sort -t_ -k2g -k1g)" x.tif[tile,pyramid,compression=jpeg] --across 6
john@kiwi:~/pics/x/x_files/11$ vipsheader x.tif
x.tif: 1524x2286 uchar, 3 bands, srgb, tiffload_stream
对于蟒蛇来说,这将类似于:
#!/usr/bin/env python3
import pyvips
tiles_across = 142
tiles_down = 150
tiles = [pyvips.Image.new_from_file(f"{x}_{y}.jpeg", access="sequential")
for y in range(tiles_down) for x in range(tiles_across)]
im = pyvips.Image.arrayjoin(tiles, across=tiles_across)
im.write_to_file("x.jpg")
这台笔记本电脑花了大约10分钟和6gb的内存加入了21000个瓦片。