首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用openimageio将32位exr图像转换为8位tiff图像的正确方法是什么?

使用openimageio将32位exr图像转换为8位tiff图像的正确方法是什么?
EN

Stack Overflow用户
提问于 2019-10-25 03:55:27
回答 2查看 758关注 0票数 0

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

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

从exr到tif的转换运行良好,但是如果我添加我想要的比特率作为参数(完全按照文档中的python公式),我什么也得不到。

然后,我尝试先转换文件格式,然后使用ImageBufAlgo.colorconvert,但却抛出了许多错误消息。

我想要做的就是旋转32位的图像,并使用正确的gamma设置将其减少到8位。

一开始我试着

代码语言:javascript
复制
    python
image = 'C/.../image.exr' # grabbing file from network
buf = oiio.ImageBuf(image)
buf.write(texture_directory + 'outImage.tif', "uint8")

这根本不起作用。代码运行了,但在我指定的目录中没有图像。

然后我把它改成

代码语言:javascript
复制
    python
image = 'C/.../image.exr' # grabbing file from network
buf = oiio.ImageBuf(image)
buf.write(texture_directory + 'outImage.tif')

这就成功了!我有图像,除了它们都是32位文件,我需要更改为8位。

所以我想我应该尝试在新的tif图像上循环,然后在单独的步骤中进行颜色转换。我只测试了一张图片,看看是否能让colorconvert函数正常工作。

代码语言:javascript
复制
    python
new_buf = oiio.ImageBuf('outImage.tif')
dst = oiio.ImageBufAlgo.colorconvert(new_buf, "sRGB", "linear")

正如文档中所描述的那样。相反,我得到的是一堆错误消息,它们与我昨天在提取像素颜色问题中得到的错误消息并没有太大的不同

代码语言:javascript
复制
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) # 

对于我没有得到的帮助和解释,我将非常感谢。

编辑:我在Larry的回复后添加了我尝试的1.7代码:

代码语言:javascript
复制
src = ImageBuf(filename)
dst = ImageBuf()
result_bool = ImageBufAlgo.colorconvert (dst, src, 'sRGB', 'linear')

我得到的错误消息是:

代码语言:javascript
复制
# 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) #
EN

回答 2

Stack Overflow用户

发布于 2019-10-25 12:24:25

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

代码语言:javascript
复制
iconvert -d uint8 in.exr out.tif

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

票数 0
EN

Stack Overflow用户

发布于 2019-10-25 13:15:09

您正在阅读的文档与您正在使用的更新版本的OIIO相对应。

在第一个问题中,您将调用

代码语言:javascript
复制
buf.write (filename, dtype="", fileformat="")

这将适用于OIIO 2.x,其中第二个参数是数据类型。但对于OIIO 1.x,函数签名是

代码语言:javascript
复制
buf.write (filename, fileformat="")

因此,它认为您指定了一个文件格式(它不知道,所以它恢复为TIFF,因为您以“.tif”结尾命名您的文件)。

您描述的第二个问题是类似的:

代码语言:javascript
复制
dst_img = ImageBufAlgo.colorconvert (src_img, fromspace, tospace)

仅在OIIO 2.0中。在OIIO 1.x中,它看起来像

代码语言:javascript
复制
result_bool = ImageBufAlgo.colorconvert (dst_img, src_img, from, to)

所以底线是,要么使用OIIO 1.x文档,要么使用OIIO 2.x库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58548333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档