Конверсия OpenEXR в QImage - PullRequest
       14

Конверсия OpenEXR в QImage

0 голосов
/ 11 апреля 2019

GetPixels () взято из EXR-изображения, загруженного с библиотекой FreeImage (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 - черная.Я, должно быть, упускаю что-то очень очевидное, но мне трудно понять это!

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

О боже, я забыл учесть количество каналов. Вот упрощенная версия:

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 голосов
/ 24 апреля 2019

Я бы использовал std :: round (l_data [i] * 255.f)

Обратите внимание, что QImages может заполнить каждую строку развертки до 32 бит.Поэтому вместо доступа к QImage :: bits () я бы предложил обратиться к QImage :: scanline (y) (или, альтернативно, к битам, объединенным с bytesPerLine ()).

...