【问题标题】:Load jpeg image texture with libjpeg from QByteArray使用 QByteArray 中的 libjpeg 加载 jpeg 图像纹理
【发布时间】:2012-12-23 08:39:33
【问题描述】:

您好,我有一个从 QNetworkReply 获得的 jpeg 图像的 QByteArray。我到处都能看到从文件中读取并解压缩的 jpeg 图像,

FILE * infile;
......
if ((infile = fopen(filename, "rb")) == NULL) 
{
     fprintf(stderr, "can't open %s\n", filename);
     exit(1);
}
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, 0);
jpeg_start_decompress(&cinfo);

然后

while (scan lines remain to be read)
      jpeg_read_scanlines(...);

但是如何从 QByteArray 而不是文件/stdio 流中读取它?

【问题讨论】:

    标签: c++ qt jpeg libjpeg qbytearray


    【解决方案1】:

    您不需要使用外部 jpeg 库:

    QByteArray array;
    // read data into array here;
    
    QPixmap image;
    image.loadFromData(array);
    

    应该够了。 Qt 将自动检测图像格式。如果您动态编译应用程序,请记住分发 Qt jpeg 插件。

    【讨论】:

    • 我需要通过 libjpeg 来实现我的目的。谢谢。
    • 如果 libjpeg 不支持读取原始数据,最简单的方法可能是将 QByteArray 内容保存到文件中。
    • 我认为确实如此。但我不知道如何 :( 这有点像使用自定义源管理器。
    【解决方案2】:

    使用

    void jpeg_mem_src(j_decompress_ptr cinfo, unsigned char * inbuffer,
                  unsigned long insize);
    

    而不是jpeg_stdio_src

     QByteArray qarr;
    
     jpeg_decompress_struct cinfo;
     jpeg_mem_src(&cinfo, qarr.data(), qarr.size());
     jpeg_read_header(&cinfo, TRUE);
     jpeg_start_decompress(&cinfo);
    
     /// etc..
    

    【讨论】:

    • 我已经按照您描述的方式解决了这个问题。无论如何谢谢:)
    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多