Масштабирование изображения с помощью libvips - PullRequest
1 голос
/ 23 мая 2019

У меня есть изображение 6130x5548 pixels, и я хочу изменить его масштаб, чтобы самая длинная сторона была 32768 pixels (а затем сделать пирамиду из плиток с 7 уровнями масштабирования).Я понимаю, что vips resize - это очевидный способ для чего-то подобного, поэтому я попробовал строку ниже

vips resize image_in.tif img_rescaled.tif 5.345513866231648

Число 5.34551 - это просто отношение 32768/6130, масштабный коэффициент по моим x axis,Если я хочу указать точные размеры в пикселях восстановленного изображения, как я могу это сделать?

Я пытался использовать vips thumbnail для этой цели, я не знаю, рекомендуется ли это или нет, но это так.Работа.

vips thumbnail image_in.tif img_rescaled.tif 32768

Что-то в этом роде, пожалуйста?

Кроме того, два подхода дают совершенно разные результаты с точки зрения размера МБ.В то время как vips thumbnail производит tif с размером 2.8Gb, вызов vips resize возвращает tif с размером 1.8Gb.

Оба изображения имеют (очевидно) одинаковые размеры 32768x29657 pixels, одинаковое разрешение 72dpi, но разные bit depth * tif из vips thumbnail имеет 24 bit depth, тогда как одно из vips resize 16 bit depth.Исходное изображение имеет bit depth=16.

Кроме того, я понимаю, что алгоритм, используемый vips translate, играет существенную роль в конечном размере файла.Могу ли я установить алгоритм при использовании vips thumbnail и / или bit depth, пожалуйста?

1 Ответ

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

resize принимает только масштабный коэффициент, поэтому его необходимо рассчитать. Вы можете использовать что-то вроде:

width=$(vipsheader -f width somefile.tif)
height=$(vipsheader -f height somefile.tif)
size=$((width > height ? width : height))
factor=$(bc <<< "scale=10; 32768 / $size")
vips resize somefile.tif huge.tif $factor

Я бы перешел на 8-битный перед масштабированием, так как вам нужно только 8 бит для отображения. Вы можете использовать:

vips colourspace thing.tif other.tif srgb

Для создания 8-битной версии srgb.

bash становится настолько уродливым, когда вы начинаете делать что-то подобное, я бы соблазнился переключиться на pyvips .

import pyvips

image = pyvips.Image.new_from_file('somefile.tif', access='sequential')
image = image.colourspace('srgb')
image = image.resize(32768 / max(image.width, image.height))
image.dzsave('mypyramid')

У него есть дополнительное преимущество в том, что он не использует никаких временных файлов. pyvips создает конвейеры операций обработки изображений, так что программа будет передавать потоки пикселей с вашего ввода, увеличивать их размер и записывать пирамиду одновременно и параллельно. Он не будет использовать много памяти, и это будет быстро.

...