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

2024-06-28 20:04:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一堆32位OpenExr文件转换为8位tifs。你知道吗

对于转换过程,我使用了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图像上循环,然后在不同的步骤中进行颜色转换。我只测试了一个图像,看看是否可以让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) #

Tags: inimagestructclassstdv1tifchar
2条回答

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

iconvert -d uint8 in.exr out.tif

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

您正在阅读的文档对应于比您使用的更新版本的OIIO。你知道吗

在第一个问题中,您正在呼叫

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

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

buf.write (filename, fileformat="")

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

你所描述的第二个问题是相似的:特殊形式的

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

仅适用于OIIO 2.0。在oiio1.x中

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

所以底线是,要么使用oiio1.x文档,要么使用oiio2.x库。你知道吗

相关问题 更多 >