GetPixels()来自装载有FreeImage库(96位:3 x 32位IEEE浮点)的EXR图像。这个想法是将像素数据转换为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为黑色。我一定会错过一些非常明显的东西,但是我很难弄清楚!
答案 0 :(得分: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位的约定?
答案 1 :(得分:0)
我会使用std :: round(l_data [i] * 255.f)
还请注意,QImage可能会将每条扫描线填充到32位。因此,建议不要访问QImage :: bits(),而建议访问QImage :: scanline(y)(或将某些位与bytesPerLine()组合)。