Как правильно конвертировать из 32-битного EXR в 8-битное изображение в формате TIFF, используя openimageio? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь преобразовать кучу 32-битных файлов OpenExr в 8-битные файлы.

Для процесса конвертации я использовал рецепты Python, приведенные в документации oiio.

Преобразование из exr в tif работало нормально, но я ничего не получаю, если добавляю требуемую скорость передачи в качестве параметра (точно следуя формуле python из документации)

ЗатемЯ попытался сначала просто конвертировать форматы файлов, а затем использовать ImageBufAlgo.colorconvert, но вместо этого я получаю много сообщений об ошибках.

Я хотел просто повернуть 32-битное изображение и уменьшить его до 8-бит с помощьюправильная настройка гаммы.

Сначала я попробовал

    python
image = 'C/.../image.exr' # grabbing file from network
buf = oiio.ImageBuf(image)
buf.write(texture_directory + 'outImage.tif', "uint8")

Это не сработало вообще. Код работал, но в указанном мною каталоге не было изображений.

Затем я изменил его на

    python
image = 'C/.../image.exr' # grabbing file from network
buf = oiio.ImageBuf(image)
buf.write(texture_directory + 'outImage.tif')

И это сработало! У меня были изображения, за исключением того, что все они были 32-битными файлами, которые мне нужно изменить на 8-битные.

Поэтому я подумал, что попробую перебрать новые tif-изображения, а затем выполнить преобразование цвета в отдельных шагах. Я протестировал только одно изображение, чтобы посмотреть, смогу ли я даже заставить работать функцию colorconvert.

    python
new_buf = oiio.ImageBuf('outImage.tif')
dst = oiio.ImageBufAlgo.colorconvert(new_buf, "sRGB", "linear")

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


Error: Python argument types in
#     ImageBufAlgo.colorconvert(ImageBuf, str, str)
# did not match C++ signature:
#     colorconvert(class OpenImageIO::v1_5::ImageBuf {lvalue} dst, class OpenImageIO::v1_5::ImageBuf src, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > from, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > to, bool unpremult=False, struct OpenImageIO::v1_5::ROI roi=<OpenImageIO.OpenImageIO.ROI object at 0x00000257C97A6348>, int nthreads=0)
# Traceback (most recent call last):
#   File "<maya console>", line 27, in <module>
# ArgumentError: Python argument types in
#     ImageBufAlgo.colorconvert(ImageBuf, str, str)
# did not match C++ signature:
#     colorconvert(class OpenImageIO::v1_5::ImageBuf {lvalue} dst, class OpenImageIO::v1_5::ImageBuf src, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > from, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > to, bool unpremult=False, struct OpenImageIO::v1_5::ROI roi=<OpenImageIO.OpenImageIO.ROI object at 0x00000257C97A6348>, int nthreads=0) # 

Буду очень признателен за любую помощь иобъяснение того, что я не получаю.

Редактировать: я добавляю код 1.7, который я попробовал после ответа Ларри:

src = ImageBuf(filename)
dst = ImageBuf()
result_bool = ImageBufAlgo.colorconvert (dst, src, 'sRGB', 'linear')

Полученное сообщение об ошибке таково:

# Error: Python argument types in
#     ImageBufAlgo.__init__(ImageBufAlgo, ImageBuf, ImageBuf, str, str)
# did not match C++ signature:
#     __init__(struct _object * __ptr64)
# Traceback (most recent call last):
#   File "<maya console>", line 32, in <module>
# ArgumentError: Python argument types in
#     ImageBufAlgo.__init__(ImageBufAlgo, ImageBuf, ImageBuf, str, str)
# did not match C++ signature:
#     __init__(struct _object * __ptr64) #

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Вы читаете документацию, которая соответствует более новой версии OIIO, чем вы используете.

В первой проблеме вы звоните

buf.write (filename, dtype="", fileformat="")

, и это будет работать с OIIO 2.x, где вторым аргументом является тип данных. Но для OIIO 1.x сигнатура функции была

buf.write (filename, fileformat="")

, поэтому она думает, что вы указываете формат файла (который он не знает, поэтому он возвращается к TIFF, потому что вы назвали свой файл, заканчивающийся на ".tif ").

Вторая описанная вами проблема похожа: конкретная форма

dst_img = ImageBufAlgo.colorconvert (src_img, fromspace, tospace)

только в OIIO 2.0. В OIIO 1.x это выглядело как

result_bool = ImageBufAlgo.colorconvert (dst_img, src_img, from, to)

Таким образом, суть в том, чтобы либо использовать документацию OIIO 1.x, либо использовать библиотеки OIIO 2.x.

0 голосов
/ 25 октября 2019

Не уверен, поможет ли это, но вы можете использовать iconvert cli, который поставляется с openimageio , который используется для преобразования форматов изображений и глубины цвета.

iconvert -d uint8 in.exr out.tif

https://openimageio.readthedocs.io/en/latest/iconvert.html

...