Как с помощью QT вывести на монитор 10-битное изображение?

116
05 сентября 2019, 04:30

Недавно появился снэпшот Qt 5.13, в котором у QImage стал доступен формат QImage::Format_Grayscale16. Около года назад мне уже приходилось работать с QImage, но тогда речь шла только о 8-битах на пиксель. Так как на работе есть 10-битный монитор, я решил попробовать создать и вывести на него градиент 1024x400, в котором каждый пиксель должен быть на тон светлее предыдущего (2^10=1024). Сформировав QByteArray следующим образом:

QByteArray *ArrayGenerator::gen10bitArr()
{
    QByteArray *arr = new QByteArray();
    uint8_t partA;
    uint8_t partB;
    for (int row = 0; row < 400; row++) {
        for (uint16_t color = 0; color < 1024; color++) {
                partA = static_cast<uint8_t>((color &0xFF00) >> 8);
                partB = static_cast<uint8_t>(color &0x00FF);
                arr->append (partA);
                arr->append (partB);
        }
    }
    return arr;
}

Я попытался сформировать QImage так же, как делал это прежде:

QImage &MainWindow::gen10bitImg(QByteArray*data, int width, int height)
{
    QImage * img = new QImage((uchar*)data->data (),
                              width, height, 2048, QImage::Format_Grayscale16);
    img->save ("image.png");
    return *img;
}

Однако, результат был неожиданным, вместо градиента на 1024px, сформировалось целых четыре по 256px:

Такое ощущение, что QImage сформировался только по четным байтам из QByteArray. Как можно побороть подобное? Кто-нибудь уже работал с QImage::Format_Grayscale16?

Answer 1

Мне представляется, что вы работаете на little endian машине и перепутали порядок байт:

 partA = static_cast<uint8_t>(color &0x00FF);
 partB = static_cast<uint8_t>((color &0xFF00) >> 8);
READ ALSO
Задача перебора значений

Задача перебора значений

Попалась следующая задачаИмеется входное значение частоты Fin и выходное Fout

99
connect с указателями в контейнере

connect с указателями в контейнере

При соединении с указателями, которые находятся внутри локального map, вылетает программа с ошибкой: Segmentation faultЕсли сделаю мап статик или как...

127
Птичий язык внутри метода если передать в него строку с кириллицей?

Птичий язык внутри метода если передать в него строку с кириллицей?

В юнит-тестах на java+spring передаю в метод строку с русскими буквамиВнутри метода в параметр приходит уже не то, что записал, например статус...

118
Libgdx. Создание колизии

Libgdx. Создание колизии

Создаю 2д стрелялку на LibgdxЕсть спрайт космического корабля и снаряда

130