Как правильно конвертировать 32-битное изображение exr в 8-битное изображение в формате TIFF с помощью openimageio
Я пытаюсь преобразовать кучу 32-битных файлов OpenExr в 8-битные файлы tif.
Для процесса конвертации я использовал рецепты 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, а затем выполнить преобразование цвета в отдельные шаги. Я протестировал только одно изображение, чтобы увидеть, смогу ли я вообще заставить работать функцию преобразования цвета.
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 ответа
Не уверен, что это поможет, но вы можете использовать iconvert
cli, поставляемый с openimageio, который используется для преобразования форматов изображений и битовой глубины.
iconvert -d uint8 in.exr out.tif
Вы читаете документацию, соответствующую более новой версии 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.