LINUX.ORG.RU

Создание QPixmap из QByteArray

 , ,


0

1

Здравствуйте. Получаю по D-Bus иконку приложения (.../StatusNotifierItem/org.kde.StatusNotifierItem/IconPixmap). Записываю в QByteArray. В QByteArray: https://pastebin.com/MPcJHHA9

Здесь, https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNoti... , указано, что в свойстве IconPixmap хранится бинарный ARGB32.

Далее использую QPixmap::loadFromData, но ничего не получается.

// data - QByteArray
QPixmap pixmap;
pixmap.loadFromData(data);
qDebug() << pixmap  // QPixmap(null)
Пытался указывать вторым аргументом разные форматы изображения, но не помогло. QImage::fromData тоже пробовал — результат аналогичный.

Подскажите, пожалуйста, что делаю не так.



Последнее исправление: thm (всего исправлений: 4)

Скорее всего ты вызываешь метод loadFromFile(), который пытается интерпретировать аргумент data как имя открываемого файла и соответственно ничего не работает.

Скорее всего тебе нужно использовать метод loadFromData(), работающий с QByteArray.

https://doc.qt.io/qt-6/qpixmap.html#loadFromData-1

EXL ★★★★★
()
Ответ на: комментарий от thm

https://ctxt.io/2/AACQhIQzFA

Иконка ножниц. Ты откуда-то должен получить размер. Я его подобрал. 32х32.

Только учти, что QByteArray::fromRawData не копирует данные из сырой строки. Используемый конструктор QImage тоже не копирует из QByteArray. Т.е. получается в данном примере сырая строка должна иметь время жизни больше чем QImage. Иначе будет доступ к освобождённой памяти на потеху растоводам.

ox55ff ★★★★★
()
Последнее исправление: ox55ff (всего исправлений: 1)
Ответ на: комментарий от ox55ff

Спасибо! Размер у меня есть (IconPixmap возвращает массив структур, каждая структура - ширина, высота, сам массив байтов). У меня сразу есть QByteArray, так что проблемы с хранением сырой строки нет. Остался один вопрос. У иконки получился немного не тот цвет) Ручки изначально зеленые (иконка copyq), а стали фиолетовые. Должен быть дополнительный аргумент при создании QImage?

thm
() автор топика
Ответ на: комментарий от ox55ff

ну, у меня же не массив int’ов, а QByteArray UPD: с другой стороны, можно пройтись по каждому байту отдельно и его сдвинуть. сейчас попробую.

thm
() автор топика
Последнее исправление: thm (всего исправлений: 1)
Ответ на: комментарий от thm

У тебя из-за big-endian данные фактически записаны в формате BGRA32, а читаешь как ARGB32. Из-за этого неправильные цвета. Тебе нужно пройтись по массиву и каждые 4 байта обратить.

Например массив из двух пикселей: big endian: «FF01AA02|FF223355» -> litle endian: «02AA01FF|553322FF». Вертикальная черта условно изображает границу пикселей.

ox55ff ★★★★★
()