LINUX.ORG.RU

Как вывести картинку в QPainter

 


1

1

Привет, ЛОР.

Тут встала задача выводить в QPainter растровую картинку, которая задана программно в виде массива байт RGB. Неупакованного. Давным-давно, во времена Qt3 был метод bitBlt, теперь все советуют вызывать drawPixmap(). Ей нужен QPixmap, который из памяти, кажется, можно загрузить только по списку определённых форматов. Не через setPixel() же её формировать, это бред. Жать массив в PNG, JPEG и даже XPM только для инициализации QPixmap — тоже бред, хоть и чуть побыстрее…

Куда копать?

★★★★★

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

Можно создать QPixmap или QImage, смотря что удобнее, с выделением памяти. А далее берешь указатель и заполняешь как угодно и чем угодно, лишь бы в формат ложилось, например RGBA или даже RGB

Это быстро работать будет

I-Love-Microsoft ★★★★★
()

https://doc.qt.io/qt-6/qimage.html#bits

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

Но не забываем что надо также указать width height, ведь данные могут быть 100х100, или же 10х1000, оно не может угадывать картинку каких размерностей грузим

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от arax

QImage::Format_RGB888

Спасибо, работает.

Но всё равно ощущение какой-то избыточности: этот Format только в конструкторе работает. Т.е. всякий раз для картинки надо конструировать новый QImage.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

https://doc.qt.io/qt-6/qimage.html#bits

А точно по этому адресу можно безопасно писать? Похоже, это адрес для чтения уже сформированного изображения.

Returns a pointer to the first pixel data. This is equivalent to scanLine(0).

Note that QImage uses implicit data sharing. This function performs a deep copy of the shared pixel data, thus ensuring that this QImage is the only one using the current return value.

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

У loadFromData() формат не тот, который задаётся enum-ом в конструкторе, а формат файла/данных. Там есть PNG, JPEG, XPM… а сырых данных я там что-то не нашёл.

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

Т.е. всякий раз для картинки надо конструировать новый QImage.

Вот это не очень понял, если поменять данные в буфере, QImage не меняется?

Но всё равно ощущение какой-то избыточности

Как я понял копирования данных не происходит и QImage просто обертка, но не проверял, я уже на qt пару лет ничего не писал.

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

А точно по этому адресу можно безопасно писать? Похоже, это адрес для чтения уже сформированного изображения.

[…] This is equivalent to scanLine(0).

А в доках scanLine есть пример, как в него пишут.

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

А в доках scanLine есть пример, как в него пишут.

А, ну да, нашёл. Получается, если разрешение не менялось, можно писать в существующий объект.

Спасибо, попробую.

hobbit ★★★★★
() автор топика