2014-01-11 5 views
2

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

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

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

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

У кого-нибудь есть идеи?

+0

Если вы укажете расширение изображения после имени, оно автоматически распознает его формат. – Sam

+1

Err ... нет, не всегда. Прочтите еще раз: «попытается угадать». – lpapp

+0

хорошо, я попробую его с форматом на этот раз.кстати, что вы подразумеваете под этим плагином png imageformat? QT уже установил libpng, поэтому мне не нужно его устанавливать на моем Linux-машине – Sam

ответ

1

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

  • Не указано формат сохранения для стартера, как на official documentation:.

    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"); // записывает изображение в ба в формате 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"; 

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

+0

Верхний код бесполезен в моем случае. только две последние строки. Он возвращает false. Я уже пробовал последние две строки. – Sam

+0

Что еще вы пробовали, вы забыли пообщаться? В любом случае, вы проголосуете за его закрытие, пока не сможете представить воспроизводимый пример. – lpapp

+0

Я имею в виду ваш код. верхняя часть записывает изображение в ba в формате PNG. нам это не нужно. нам нужны loadFromData() и save(). сохранение изображения с указанным форматом также возвращает false. Кстати, почему вы так уверены, что заголовок PNG автоматически добавляется в pixmap? – Sam

0

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

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

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