做图像金字塔时的 libvips 和 padding
libvips and padding when doing image pyramids
我正在尝试使用非正方形图像制作金字塔图块 (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
图块时需要一些填充。但是 vips
和 gdal2tiles
之间的填充不同。前者在 tile 的底部添加填充,而后者在顶部添加填充(并且是透明的)。见下图。金字塔根部的 256x256
瓦片中显示的内容(即 zoom level=0
)。我已经手动添加了黄色背景和黑色轮廓。
对于 vips
,是否可以使用与 gdal2tiles
类似的填充,以便图块的左下角与图像中的左下角重合?我在我的图像上绘制点,因此它有助于将原点放在左下角。
如何让 vips
也有透明背景? (不过最好放在单独的 post 中...)
您可以 运行 dzsave
作为任何 vips 操作的输出,方法是使用 .dz
作为文件扩展名并将参数放在文件名后的方括号中。例如,这个命令:
vips dzsave my_image.tif out_folder --layout google --suffix .png
也可以写成:
vips copy my_image.tif out_folder.dz[layout=google,suffix=.png]
所以您可以通过在 运行ning 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
:
(我添加了黑线来显示边缘)
要获得透明背景,您需要添加 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
:
(添加了绿色背景以显示透明度)
我正在尝试使用非正方形图像制作金字塔图块 (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
图块时需要一些填充。但是 vips
和 gdal2tiles
之间的填充不同。前者在 tile 的底部添加填充,而后者在顶部添加填充(并且是透明的)。见下图。金字塔根部的 256x256
瓦片中显示的内容(即 zoom level=0
)。我已经手动添加了黄色背景和黑色轮廓。
对于 vips
,是否可以使用与 gdal2tiles
类似的填充,以便图块的左下角与图像中的左下角重合?我在我的图像上绘制点,因此它有助于将原点放在左下角。
如何让 vips
也有透明背景? (不过最好放在单独的 post 中...)
您可以 运行 dzsave
作为任何 vips 操作的输出,方法是使用 .dz
作为文件扩展名并将参数放在文件名后的方括号中。例如,这个命令:
vips dzsave my_image.tif out_folder --layout google --suffix .png
也可以写成:
vips copy my_image.tif out_folder.dz[layout=google,suffix=.png]
所以您可以通过在 运行ning 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
:
(我添加了黑线来显示边缘)
要获得透明背景,您需要添加 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
:
(添加了绿色背景以显示透明度)