Как преобразовать QImage в QByteArray?

Я пытаюсь создать QByteArray из QImage, однако, хотя я пробовал много вариантов, я не мог с этим справиться.

Что я делаю:

QImage img_enrll; // <--- There is an image coming from another function. 

QByteArray arr((char*)img_enrll.bits(),img_enrll.byteCount());  // <-- convertion but I am not sure it is true or not. 

funcCheck((unsigned char*)arr.data(), arr.size(), 0, &sam, 1, &n);


virtual Error funcCheck (const uint8_t    src[],
                           size_t           src_len,
                           size_t           tout_ms,
                           IRawSample*      dst[],
                           size_t           dst_len,
                           size_t*          dst_n )

Однако код ошибки возвращает неверные данные. Я думаю, что преобразование QImage в QByteArray неправильно. Пожалуйста, не могли бы вы помочь мне, как преобразовать в QByteArray?


person goGud    schedule 07.12.2014    source источник


Ответы (3)


Вы можете сделать это:

QImage img_enrll;
QByteArray arr;
QBuffer buffer(&arr);
buffer.open(QIODevice::WriteOnly);
img_enrll.save(&buffer, "yourformat");

Написав это, если вам это нужно для сериализации, вам лучше использовать QDataStream.

person lpapp    schedule 07.12.2014
comment
О, спасибо, я тоже пробовал это решение раньше. Но QDataStream дает мне хорошее представление о том, как решить эту проблему. И тоже нормально работает :) - person goGud; 07.12.2014
comment
Хм, я видел это решение в документации Qt, но в моем случае буфер остается пустым. А именно, Q_ASSERT(buffer.data().size() > 0); выдает исключение. Конечно, я проверил, что QImage действителен: я загрузил его из файла, преобразовал в QPixmap и отобразил внутри QLabel. - person Alexandr Zarubkin; 26.01.2017

Попробуй это:

QByteArray arr = QByteArray::fromRawData((const char*)img.bits(), img.byteCount());
person Tarek.Mh    schedule 22.01.2019
comment
Не приводит к const char* усечению const uchar* не так ли? - person Mikhail; 20.04.2020

В моем случае мне нужна была глубокая копия, поэтому сработало следующее:

QByteArray arr(img.byteCount(), Qt::Uninitialized) // or resize if it already exists
memcpy(arr.data(), img.constBits(), img.byteCount());
person Adriel Jr    schedule 21.05.2021