无法使用带有openEXR的ImageMagick更改EXR文件的通道深度

无法使用带有openEXR的ImageMagick更改EXR文件的通道深度,imagemagick,openexr,Imagemagick,Openexr,我想将16位(一半)exr图像转换为32位exr图像。我正在尝试使用openEXR构建的ImageMagick来实现这一点,但我无法实现同样的功能 我已在启用HDRI标志的情况下构建ImageMagick-7.0.8-23-Q8-windows-x64-static。我使用的是16位RGBA EXR文件。当我运行以下命令时: 标识-详细的“Desk.exr” 它给出的通道深度为8位 格式:EXR(高动态范围(HDR)) 类别:DirectClass 几何图形:644x874+0+0 单位:未定

我想将16位(一半)exr图像转换为32位exr图像。我正在尝试使用openEXR构建的ImageMagick来实现这一点,但我无法实现同样的功能

我已在启用HDRI标志的情况下构建ImageMagick-7.0.8-23-Q8-windows-x64-static。我使用的是16位RGBA EXR文件。当我运行以下命令时:

标识-详细的“Desk.exr”

它给出的通道深度为8位

格式:EXR(高动态范围(HDR))
类别:DirectClass
几何图形:644x874+0+0
单位:未定义
色彩空间:RGB
类型:TrueColorAlpha
基本类型:未定义
Endianess:未定义
深度:8位
通道深度:
红色:8位
绿色:8位
蓝色:8位
Alpha:1位

我试图通过使用convert工具指定-depth 16和32来更改它,但它仍然显示通道深度为8位

int main() {

Magick::InitializeMagick(“”);
Magick::图像;
Magick::图像2;
Magick::图像3;
试一试{
//将文件读入图像对象
image.read(“D:\\IR\\EXR\u Support\\Images\\Desk.EXR”);
//将位设置为32
图像深度(32);
channelDepth(MagickCore::rgbcchannels,32);
image.write(“D:\\IR\\EXR\u Support\\Images\\Desk\u 32Bits.EXR”);
}
捕获(Magick::异常和错误)
{

cout量子深度,也称为Q设置,是在编译时指定的。您不能在运行时增加它


如果要处理32位映像,需要使用32位量子深度重新编译。

有没有办法编译支持8位、16位和32位的通用版本?如果使用32位量子深度编译,将不必要地为8位映像保留额外的空间。好吧,您唯一可以制作的通用版本是32位v版本。我不相信在加载8位图像后将
深度设置为
8
会节省内存-我认为它仍将使用32位存储(RAM)每个示例。可能有比我更了解情况的人会评论@fmw42?如果你使用IM 7,默认情况下它启用了HDRI。如果格式支持,使用HDRI你可以读写32位文件。但是Imagemagick可能只支持“一半”(16位)文件。我没有这方面的经验。我尝试使用IM 7将16位EXR文件转换为32位,使用
-define quantum:format=floating-point-depth 32
,但之后它只显示16位。所以看起来IM只支持16位格式的EXR。我使用Q32构建了IM,现在运行identifite-verbose“Desk.EXR”它将深度设置为32位。似乎IM正在读取构建深度与文件深度无关的文件。即使我尝试使用*convert-depth 16*将此文件转换为16位,它仍然显示32位EXR将颜色数据存储为浮点值。使用Q8库版本对其进行解码将导致严重的精度损失。
Magick::InitializeMagick("");

Magick::Image image;
Magick::Image image2;
Magick::Image image3;
try {
     // Read a file into image object 
    image.read("D:\\IR\\EXR_Support\\Images\\Desk.exr");
            //Set bit to 32
    image.depth(32);
            image.channelDepth(MagickCore::RGBChannels,32);
            image.write("D:\\IR\\EXR_Support\\Images\\Desk_32Bits.exr");

    }
catch (Magick::Exception &error_)
{
    cout << "Caught exception: " << error_.what() << endl;
    return 1;
}
    return 0;