做图像金字塔时的libvips和填充

时间:2019-05-22 21:41:01

标签: image-processing gdal vips

我正在尝试制作具有非正方形图像(width: 32768px and height: 18433px)

的瓷砖金字塔

我正在使用libvips,如下所示:

vips dzsave my_image.tif out_folder --layout google --suffix .png

出于相同的目的,我还使用了gdal2tiles

python gdal2tiles.py -p raster -z 0-7 -w none my_image.tif

由于我的图像不是正方形,因此在创建256x256磁贴时需要进行一些填充。但是,vipsgdal2tiles之间的填充是不同的。前者在图块的底部添加填充,而后者在顶部(并且是透明的)添加填充。参见下图。金字塔根(即256x256)的zoom level=0磁贴中显示的内容。我已经手动添加了黄色背景和黑色轮廓。

使用vips,是否可以使用与gdal2tiles类似的填充,以便图块的左下角与图像中的左下角重合?我在图像上绘制点,因此有助于将原点放在左下角。

我还如何对vips具有透明背景? (不过最好在单独的帖子中...)

enter image description here

1 个答案:

答案 0 :(得分:2)

通过使用dzsave作为文件扩展名,并将参数放在文件名后的方括号中,可以将.dz作为任何vips操作的输出。例如,以下命令:

vips dzsave my_image.tif out_folder --layout google --suffix .png

也可以写成:

vips copy my_image.tif out_folder.dz[layout=google,suffix=.png]

因此,您可以通过在运行dzsave之前将输入图像扩展为正方形来解决您的问题。

例如:

$ vips gravity Chicago.jpg dir.dz[layout=google,suffix=.png,skip_blanks=0] south-west 32768 32768 --extend white

32768是该图像宽度之上的2的最接近幂。 skip_blanks选项使dzsave不输出等于空白背景图块的图块。

该命令使此dir/0/0/0.png

enter image description here

(我添加了黑线以显示边缘)

要获得透明背景,您需要添加一个Alpha。这将需要另一个命令,并且超出了vips CLI的真正用途。

我会改用Python之类的东西。例如,使用pyvips,您可以编写:

import sys
import pyvips

im = pyvips.Image.new_from_file(sys.argv[1], access='sequential')

im = im.addalpha()

# expand to the nearest power of two larger square ... by default, gravity will
# extend with 0 (transparent) pixels
size = 1 << int.bit_length(max(im.width, im.height))
im = im.gravity('south-west', size, size)

im.dzsave(sys.argv[2], 
          layout='google', suffix='.png', background=0, skip_blanks=0)

像这样运行:

$ ./mkpyr.py ~/pics/Chicago.jpg x

要创建此x/0/0/0.png

enter image description here

(添加绿色背景以显示透明度)