необработанное растровое изображение в PNG в QT

У меня есть bytearray, где каждые три байта описывают 1 пиксель (RGB). Задача конвертировать в jpeg или png. Я получаю палитру изображений из сокета, создаю соответствующий RGB24 из имеющейся у меня таблицы RGB.

Проблема в том, что сейчас я не могу преобразовать это растровое изображение в png. Например:

image.loadFromData((const char*)bytes);
qDebug() << image.save("/home/saman/image.png");

если это не так, другой вариант - добавить png-заголовок в массив растровых изображений. Однако я понятия не имею, как это сделать.

У кого-нибудь есть идеи, пожалуйста?


person Sam    schedule 11.01.2014    source источник
comment
если вы укажете расширение изображения после имени, он автоматически распознает его формат.   -  person Sam    schedule 11.01.2014
comment
Эээ ... нет, не всегда. Прочтите еще раз: попытаюсь угадать.   -  person lpapp    schedule 11.01.2014
comment
хорошо, на этот раз я попробую с форматированием. кстати, что вы имеете в виду под этим плагином png imageformat? В QT уже установлен libpng, поэтому мне не нужно устанавливать его на моем Linux-компьютере   -  person Sam    schedule 11.01.2014
comment
нет, это не так. поскольку изображение является растровым без заголовков, libpng, созданный внутри QT, вызовет ошибку. это не зависит от упоминания типа формата.   -  person Sam    schedule 11.01.2014
comment
Невозможно воспроизвести проблему, поэтому обратитесь к SSCCE.   -  person lpapp    schedule 11.01.2014
comment
Год спустя это все еще не решено ??   -  person lpapp    schedule 21.12.2014
comment
Это все еще не решено два года спустя ??   -  person pushandpop    schedule 27.11.2015


Ответы (2)


Кажется, я использовал конструктор, чтобы упомянуть используемый bytesPerLine.

  QImage *image =new QImage((const uchar*)bytes.constData(),600, 800,1800,QImage::Format_RGB888);

с упомянутыми байтами на строку теперь все работает нормально.

person Sam    schedule 11.01.2014

У вас есть несколько проблем в этих двух строках:

  • Не указан формат сохранения для стартера согласно официальной документации: .

    QImage image; QByteArray ba; Буфер QBuffer (& ba); buffer.open (QIODevice :: WriteOnly); image.save (& буфер, "PNG"); // записывает изображение в ba в формате PNG

  • Не указан формат загрузки.

  • Вы выполняете приведение типа C в код C ++.

  • Вы выполняете приведение без необходимости, поскольку существует перегрузка QByteArray.

  • Вы выполняете преобразование в char *, тогда как ожидание для этой конкретной перегрузки - unsigned char *.

  • Вы не проверяете возвращаемое значение операции загрузки.

    QImage image; QByteArray ba; Буфер QBuffer (& ba); buffer.open (QIODevice :: WriteOnly); image.save (& буфер, "PNG"); // записывает изображение в ba в формате PNG

Итак, в вашем случае я бы написал примерно следующее:

if (!image.loadFromData((const char*)bytes, QImage::Format_RGB888))
    qDebug() << "Could not load the image";

if (!image.save("/home/saman/image.png"), "PNG"))
    qDebug() << "Could not save the image";

Естественно, вам также необходимо убедиться, что ширина и высота соответствуют изображению, потому что в противном случае необработанные данные будут просто последовательными, и экземпляр класса не может действительно волшебным образом вычислить.

person lpapp    schedule 11.01.2014
comment
Верхний код в моем случае бесполезен. только две последние строчки. Возвращает false. Последние две строчки я уже пробовал. - person Sam; 11.01.2014
comment
Что еще вы пробовали забыть сообщить? В любом случае вы проголосуете за его закрытие, пока не представите воспроизводимый пример. - person lpapp; 11.01.2014
comment
я имею в виду ваш код. верхняя часть записывает изображение в ba в формате PNG. нам это не нужно. нам нужны loadFromData () и save (). сохранение изображения в указанном формате также возвращает false. Кстати, почему вы так уверены, что заголовок PNG автоматически добавляется в растровое изображение? - person Sam; 11.01.2014
comment
@ user1596226: вы не предоставили никаких примеров для воспроизведения проблемы. Более того, вы даже не следили за такими предложениями, как проверка возвращаемого значения load, установка правильного формата при загрузке и т.д ... вы также не пробовали PNG в соответствии с вашим предыдущим комментарием. Мы так много можем сделать для вас ... - person lpapp; 11.01.2014
comment
что-то странно, Load возвращает false! хотя я уверен, что у байтов есть содержимое. loadFromData (bytes.constData ()) = false, почему? bytes заполнен и прямо сейчас отображает все свое содержимое на осыпи. - person Sam; 11.01.2014
comment
if (! image.loadFromData ((const unsigned char *) bytes.constData (), QImage :: Format_RGB888)) qDebug () ‹< Не удалось загрузить изображение; возвращает FALSE - person Sam; 11.01.2014
comment
@ user1596226: ты разобрался в мельчайших деталях? - person lpapp; 30.01.2014