首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenEXR到QImage的转换

OpenEXR到QImage的转换
EN

Stack Overflow用户
提问于 2019-04-11 09:58:43
回答 2查看 111关注 0票数 0

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

编辑:我使用了Barcelona Rooftops

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

代码语言:javascript
复制
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是黑色的。我肯定遗漏了一些非常明显的东西,但我很难弄清楚!

EN

回答 2

Stack Overflow用户

发布于 2019-04-12 07:52:57

哦,天哪,我忘了把频道数考虑进去了。简化版如下:

代码语言:javascript
复制
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位的约定?

票数 2
EN

Stack Overflow用户

发布于 2019-04-24 21:45:51

我会使用std::round(l_datai * 255.f)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55623617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档