#cpp #qt #изображения
Недавно появился снэпшот 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((color &0xFF00) >> 8); partB = static_cast (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?
Ответы
Ответ 1
Мне представляется, что вы работаете на little endian машине и перепутали порядок байт: partA = static_cast(color &0x00FF); partB = static_cast ((color &0xFF00) >> 8);
Комментариев нет:
Отправить комментарий