0

我正在尝试将一堆 32 位 OpenExr 文件转换为 8 位 tif。

对于转换过程,我使用了 oiio 文档中提供的 python 配方。

从 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) #
4

2 回答 2

0

不确定这是否有帮助,但您可以使用openimageioiconvert附带的 cli ,它用于转换图像格式和位深度。

iconvert -d uint8 in.exr out.tif

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

于 2019-10-25T04:24:25.237 回答
0

您正在阅读的文档对应于比您使用的更新版本的 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 库。

于 2019-10-25T05:15:08.580 回答