libvips и padding при выполнении пирамид изображений - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь сделать пирамиду из плиток с неквадратным изображением (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 отличаются.Первый добавляет отступы внизу тайла, а второй сверху (и прозрачный).Смотрите изображение ниже.Что показано на плитке 256x256 в корне пирамиды (то есть zoom level=0).Я вручную добавил желтый фон и черный контур.

При vips возможно ли заполнение, аналогичное gdal2tiles, чтобы левый нижний угол плитки совпадал с тем, что на изображении?Я строю точки на своем изображении, поэтому это помогает иметь начало координат внизу слева.

Как я могу также иметь прозрачный фон с vips?(хотя может быть лучше в отдельном посте ...)

enter image description here

1 Ответ

2 голосов
/ 23 мая 2019

Вы можете запустить 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]

Так что вы можете решить вашу проблему, расширив входное изображение до квадрата перед запуском dzsave.

Например:

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

32768 - это ближайшая степень двойки, превышающая ширину изображения.Опция skip_blanks позволяет dzsave не выводить плитки равными пустым фоновым плиткам.

Эта команда делает это dir/0/0/0.png:

enter image description here

(я добавил черные линии, чтобы показать края)

Чтобы получить прозрачный фон, нужно добавить альфа.Для этого потребуется другая команда, и она выходит за рамки того, для чего на самом деле разработан CLI vips.

Я бы переключился на что-то вроде 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

(добавлен зеленый фон для отображения прозрачности)

...