Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenEXR到QImage的转换_C++_Qt_Qimage - Fatal编程技术网

C++ OpenEXR到QImage的转换

C++ OpenEXR到QImage的转换,c++,qt,qimage,C++,Qt,Qimage,GetPixels()来自加载了FreeImage库(96位:3 x 32位IEEE浮点)的EXR图像。其思想是将像素数据转换为QImage::Format_RGB888 编辑:我用过 以下是我到目前为止得到的信息: uint l_h = m_ZImage->GetHeight(); uint l_w = m_ZImage->GetWidth(); float *l_data = (float*)m_ZImage->GetPixels(); m_QImage = QImage(

GetPixels()来自加载了FreeImage库(96位:3 x 32位IEEE浮点)的EXR图像。其思想是将像素数据转换为QImage::Format_RGB888

编辑:我用过

以下是我到目前为止得到的信息:

uint l_h = m_ZImage->GetHeight();
uint l_w = m_ZImage->GetWidth();
float *l_data = (float*)m_ZImage->GetPixels();
m_QImage = QImage(l_w, l_h, QImage::Format_RGB888);
uchar *l_pixels = m_QImage.bits();

for (uint i = 0; i < l_h; ++i)
{
    for (uint j = 0; j < l_w; ++j)
    {
        uint l_id = (i * l_w) + j;
        l_pixels[l_id] = uchar(l_data[l_id] * 255); l_id++;
        l_pixels[l_id] = uchar(l_data[l_id] * 255); l_id++;
        l_pixels[l_id] = uchar(l_data[l_id] * 255);
    }
}
uint l_h=m_ZImage->GetHeight();
uint l_w=m_ZImage->GetWidth();
float*l_data=(float*)m_ZImage->GetPixels();
m_QImage=QImage(l_w,l_h,QImage::Format_RGB888);
uchar*l_pixels=m_QImage.bits();
对于(uint i=0;i

虽然图像的上三分之一是正确的,但下三分之二是黑色的。我一定错过了一些非常明显的东西,但我很难弄清楚

噢,天哪,我忘了考虑频道数。以下是简化版本:

uint l_h = m_ZImage->GetHeight();
uint l_w = m_ZImage->GetWidth();
uint l_count = l_w * l_h * m_ZImage->GetChannelCount();
float *l_data = reinterpret_cast<float*>(m_ZImage->GetPixels());
m_QImage = QImage(l_w, l_h, QImage::Format_RGB888);
uchar *l_pixels = m_QImage.bits();

for (uint i = 0; i < l_count; ++i)
{
    l_pixels[i] = ZMath::ClampToByte(l_data[i] * 255); /// Edit
}
uint l_h=m_ZImage->GetHeight();
uint l_w=m_ZImage->GetWidth();
uint l_count=l_w*l_h*m_ZImage->GetChannelCount();
float*l_data=reinterpret_cast(m_ZImage->GetPixels());
m_QImage=QImage(l_w,l_h,QImage::Format_RGB888);
uchar*l_pixels=m_QImage.bits();
对于(uint i=0;i

另一方面,白色是不正确的,因为有一个表外彩虹效应。在原来的问题上堆积如山。是否有将图像数据从32位转换为8位的约定?

哦,天哪,我忘了考虑通道数。以下是简化版本:

uint l_h = m_ZImage->GetHeight();
uint l_w = m_ZImage->GetWidth();
uint l_count = l_w * l_h * m_ZImage->GetChannelCount();
float *l_data = reinterpret_cast<float*>(m_ZImage->GetPixels());
m_QImage = QImage(l_w, l_h, QImage::Format_RGB888);
uchar *l_pixels = m_QImage.bits();

for (uint i = 0; i < l_count; ++i)
{
    l_pixels[i] = ZMath::ClampToByte(l_data[i] * 255); /// Edit
}
uint l_h=m_ZImage->GetHeight();
uint l_w=m_ZImage->GetWidth();
uint l_count=l_w*l_h*m_ZImage->GetChannelCount();
float*l_data=reinterpret_cast(m_ZImage->GetPixels());
m_QImage=QImage(l_w,l_h,QImage::Format_RGB888);
uchar*l_pixels=m_QImage.bits();
对于(uint i=0;i
另一方面,白色是不正确的,因为有一个表外彩虹效应。在原来的问题上堆积如山。是否有将图像数据从32位转换为8位的约定?

我将使用std::round(l_data[I]*255.f)

还要注意,QImages可能会将每个扫描行填充到32位。因此,我建议不要访问QImage::bits(),而是访问QImage::scanline(y)(或者与bytesPerLine()组合的位)。

我将使用std::round(l_data[I]*255.f)


还要注意,QImages可能会将每个扫描行填充到32位。因此,与其访问QImage::bits(),我建议访问QImage::scanline(y)(或者bits与bytesPerLine()组合)。

您可以共享imageSure,请参阅编辑链接。您可以共享imageSure,请参阅编辑链接。我想我是通过ClampToByte获得的