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是黑色的。我肯定遗漏了一些非常明显的东西,但我很难弄清楚!
发布于 2019-04-12 07:52:57
哦,天哪,我忘了把频道数考虑进去了。简化版如下:
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位的约定?
发布于 2019-04-24 21:45:51
我会使用std::round(l_datai * 255.f)
另请注意,QImages可能会将每条扫描线填充到32位。因此,我建议不要访问QImage:: bits (),而要访问QImage::scanline(y) (或者将bits与bytesPerLine()结合使用)。
https://stackoverflow.com/questions/55623617
复制相似问题