我有bytearray,其中每三个字节描述1个像素(RGB)。任务是将其转换为jpeg或png。我从socket接收图像调色板,从我拥有的RGB表构建其相关的RGB24。
我遇到的问题是我现在无法将此位图转换为png。例如:
image.loadFromData((const char*)bytes);
qDebug() << image.save("/home/saman/image.png");
如果不是这样,另一个选择是将png标头添加到位图数组中。但是,我不知道该怎么做。
有人有任何想法吗?
答案 0 :(得分:1)
这两行有几个问题:
未按照official documentation:指定启动器的保存格式。
QImage图像; QByteArray ba; QBuffer缓冲区(&amp; ba); buffer.open(QIODevice中::只写); image.save(&amp; buffer,“PNG”); //以PNG格式将图像写入ba
未指定加载格式。
您正在使用C ++代码进行 C类型转换。
由于QByteArray超载,你正在不必要地进行演员表。
您正在转换为char *,而对该特定重载的期望是 unsigned char *。
您不检查加载操作的返回值。
QImage图像; QByteArray ba; QBuffer缓冲区(&amp; ba); buffer.open(QIODevice中::只写); image.save(&amp; buffer,“PNG”); //以PNG格式将图像写入ba
所以,在你的情况下,我会写这样的东西:
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";
当然,您还需要确保图像的宽度和高度正确,否则,原始数据只是顺序的,而且类实例无法真正神奇地弄明白。
答案 1 :(得分:0)
似乎我shoudav使用构造函数来提及使用的bytesPerLine。
QImage *image =new QImage((const uchar*)bytes.constData(),600, 800,1800,QImage::Format_RGB888);
现在提到的每行字节数一切正常。