Изменение размера изображения с помощью Python OpenImageIO поддерживает соотношение сторон
Я пытаюсь изменить размер изображения после некоторой дополнительной обработки с использованием OpenImageIO и python. Однако, похоже, этот процесс не так прост, как PIL. В PIL я могу предоставить новое разрешение, например, 512 x 512, и оно изменит размер моего изображения независимо от его текущего пиксельного аспекта и изменит его размер так, чтобы он соответствовал максимальной длине, чтобы он помещался в поле 512x512. Как я могу сделать это с помощью OpenImageIO?
В настоящее время это просто растянет изображение до 512x512.
Таким образом, изображения, которые предпочитают ширину, должны соответствовать на основе значения ширины:
Принимая во внимание, что изображения, которые одобряют высоту, должны соответствовать на основе значения высоты:
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 ответ
Для простоты предположим, что источником изображения является (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)
Это не в моей голове, вы должны проверить это и исправить, если я допустил ошибки. Но это суть.
Обратите внимание: когда я создаю измененный размер буфера, я использовал количество каналов и формат данных исходного файла, что немного более надежно, чем жесткое его кодирование до 3-х каналов с плавающей запятой, как вы делали в оригинале.