OpenEXR到QImage的转换

问题描述 投票:0回答:2

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

编辑:我用过Barcelona Rooftops

这是我到目前为止所得到的:

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);
    }
}

虽然图像的前三分之一是正确的,但底部的2/3是黑色的。我一定错过了一些非常明显的东西,但我很难搞清楚!

c++ qt qimage
2个回答
1
投票

哦,我的,我忘了把频道数考虑在内。这是简化版本:

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
}

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


0
投票

我会用std :: round(l_data [i] * 255.f)

另请注意,QImages可能会将每条扫描线填充到32位。因此,我建议不要访问QImage :: bits(),而是访问QImage :: scanline(y)(或者与bytesPerLine()结合使用的位)。

© www.soinside.com 2019 - 2024. All rights reserved.