Изменение размера изображения с помощью Python OpenImageIO поддерживает соотношение сторон

1

Я пытаюсь изменить размер изображения после выполнения дополнительной обработки с использованием OpenImageIO и python. Однако, похоже, этот процесс не так прост, как PIL. В PIL я могу предоставить новое разрешение, например 512 x 512, и оно изменит размер моего изображения независимо от его текущего пиксельного аспекта и изменит его размер до максимальной длины, чтобы он помещался внутри блока 512x512. Как я могу это сделать с помощью OpenImageIO?

В настоящее время это просто растянет изображение до 512x512.

Таким образом, изображения, которые предпочитают ширину, должны соответствовать основанию на основе значения ширины: Изображение 174551

В то время как изображения, которые поддерживают высоту, должны соответствовать основанию на основе значения высоты: Изображение 174551

buf = oiio.ImageBuf(file)
data = buf.spec()
print data.width
print data.height
resized = oiio.ImageBuf(oiio.ImageSpec (512, 512, 3, oiio.FLOAT))
oiio.ImageBufAlgo.resize(resized, buf, roi=oiio.ROI.All, nthreads=4)
resized.write(output)
Теги:

1 ответ

1
Лучший ответ

Для простоты предположим, что начало изображения - (0,0) (т.е. Это не изображение "обрезка" или "перескакивание"). Мы можем думать о изображениях, которые шире, чем они длинны ("пейзаж"), или длиннее, чем широкий ("портрет").

Я думаю, вам нужно что-то вроде следующего, которое использует ширину цели для пейзажа и высоту цели для портрета и перерасчет правильного размера в другом направлении:

goal_width = ...
goal_height = ...

buf = oiio.ImageBuf(file)
spec = buf.spec()
w = spec.width
h = spec.height
aspect = float(w) / float(h)
if aspect >= 1.0 :
    # source image is landscape (or square)
    goal_height = int(h * goal_height / w)
else :
    # source image is portrait
    goal_width = (w * goal_width / h)

resized = oiio.ImageBuf(oiio.ImageSpec (goal_width, goal_height, spec.nchannels, spec.format))
oiio.ImageBufAlgo.resize(resized, buf)
resized.write(output)

Это с моей головы, вы должны проверить его и настроить, если я сделал ошибки. Но это суть.

Кроме того: обратите внимание, что при создании измененного buf я использовал количество каналов и формат данных исходного файла, который немного более прочен, чем жесткое кодирование, до 3 chans float, как и в оригинале.

  • 0
    спасибо за вашу помощь это то, что мне нужно :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню