Imagemagick 如何将dzi文件转换为多平铺金字塔tiff格式

Imagemagick 如何将dzi文件转换为多平铺金字塔tiff格式,imagemagick,tiff,deepzoom,openseadragon,openslide,Imagemagick,Tiff,Deepzoom,Openseadragon,Openslide,关于答案() 我对这个话题很感兴趣,如果我错了,请纠正 我正在尝试从.dzi(深度缩放图像)格式创建多平铺tiff,我的做法是: (i) 选择最高级别文件夹 (ii)将m行的所有n列(m_n.jpeg,我指的是以这种格式保存的图像)垂直缝合为png图像。所以它们占据了相当大的空间 (iii)最后,我使用pyvips.image.write_to_file()将所有这些垂直png图像水平合并为一个完整的png图像 (iv)最后使用vips im_save,我将完整图像png转换为tiff 我现在担

关于答案()

我对这个话题很感兴趣,如果我错了,请纠正

我正在尝试从.dzi(深度缩放图像)格式创建多平铺tiff,我的做法是:

(i) 选择最高级别文件夹

(ii)将m行的所有n列(m_n.jpeg,我指的是以这种格式保存的图像)垂直缝合为png图像。所以它们占据了相当大的空间

(iii)最后,我使用pyvips.image.write_to_file()将所有这些垂直png图像水平合并为一个完整的png图像

(iv)最后使用vips im_save,我将完整图像png转换为tiff

我现在担心的是,这一过程花费了将近2个小时来制作30000个base_瓷砖的完整图像png,而且它的大小达到了10+GB(完整图像png)

有没有更好更快的方法进行.dzi到tiff的转换?

有一个操作符,可以将一组瓷砖连接到一个大图像中

您可以这样使用它(在linux命令行上):

这将加载当前目录中的所有JPG图像,将它们组合成一个巨大的网格,20个图像,并以TIFF金字塔的形式写入。显然,您需要检查网格的大小,并跨参数调整

$()
部分首先按y,然后按数字顺序按x对表单的文件名进行排序。如果没有这一点,瓷砖将被转移,令人烦恼

假设重叠为0。如果平铺重叠,则需要设置
hspacing
vspacing
选项来控制平铺的定位方式。例如:

vips arrayjoin "$(ls *.jpg | sort -t_ -k2g -k1g)" x.tif --across 20 --hspacing 254 --vspacing 254
将在水平和垂直方向上每隔254像素定位一次磁贴

arrayjoin
必须能够打开所有输入图像,因此需要大量文件描述符。大多数Linuxe默认为每个进程一次最多打开1024个文件,因此您可能需要提高这个数字。通常,您只需编辑几个配置文件,然后注销并再次登录。我将系统设置为65536,但您可以使用任何号码

Windows对每个进程有2000个文件的硬限制,您不能更改这些文件。你需要在那个平台上分段组装

这里有一个成功的例子。首先,创建没有重叠的deepzoom棱锥体:

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
对于pyvips,它将类似于:

#!/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")
在这台笔记本电脑上连接21000个磁贴大约需要10分钟和6gb的ram。

有一个操作员可以将一组磁贴连接到一个大图像中

您可以这样使用它(在linux命令行上):

这将加载当前目录中的所有JPG图像,将它们组合成一个巨大的网格,20个图像,并以TIFF金字塔的形式写入。显然,您需要检查网格的大小,并跨
参数调整

$()
部分首先按y,然后按数字顺序按x对表单的文件名进行排序。如果没有这一点,瓷砖将被转移,令人烦恼

假设重叠为0。如果平铺重叠,则需要设置
hspacing
vspacing
选项来控制平铺的定位方式。例如:

vips arrayjoin "$(ls *.jpg | sort -t_ -k2g -k1g)" x.tif --across 20 --hspacing 254 --vspacing 254
将在水平和垂直方向上每隔254像素定位一次磁贴

arrayjoin
必须能够打开所有输入图像,因此需要大量文件描述符。大多数Linuxe默认为每个进程一次最多打开1024个文件,因此您可能需要提高这个数字。通常,您只需编辑几个配置文件,然后注销并再次登录。我将系统设置为65536,但您可以使用任何号码

Windows对每个进程有2000个文件的硬限制,您不能更改这些文件。你需要在那个平台上分段组装

这里有一个成功的例子。首先,创建没有重叠的deepzoom棱锥体:

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
对于pyvips,它将类似于:

#!/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")

在这台笔记本电脑上加入21000块瓷砖大约需要10分钟和6gb内存。

是的,这似乎是基本做法。是否将每个中间合并保存为文件?如果可以的话,我想在内存中完成这一切会更有效率。我不确定哪种工具最适合(看起来你在使用VIP…也许他们有一种批处理操作的技术)。顺便说一句,如果你的平铺一侧大约有256个像素,并且在最大级别上有30000个,那么这将是一个侧面大约有44000个像素的图像,也就是大约20亿个像素。我不知道你得到了多少压缩,但10GB似乎是合理的。嗨,iangilman,谢谢你的想法,我所有的图像都是512x512,最后的合并都是使用pyvips在内存中进行的,但这种转换总共需要大约2个小时才能将图像写入磁盘,这花费了太多的时间,有没有更好的方法?我不知道,但看起来你从jcupitt那里得到了一些很好的帮助!是的,这似乎是最基本的做法。是否将每个中间合并保存为文件?如果可以的话,我想在内存中完成这一切会更有效率。我不确定哪种工具最适合(看起来你在使用VIP…也许他们有一种批处理操作的技术)。顺便说一句,如果你的平铺一侧大约有256个像素,并且在最大级别上有30000个,那么这将是一个侧面大约有44000个像素的图像,也就是大约20亿个像素。我不知道你得到了多少压缩,但10GB似乎是合理的。嗨,伊恩吉尔曼,谢谢你的想法,我所有的图像都是512x512,最后的merg