2011-10-31 314 views
3

使用Qt 4.8rc1,我有一个QImage,我想转换为PNG文件。它似乎需要更长的时间才能转换为PNG格式:800x800空png需要70毫秒。有没有办法让这个效率更高,还是我本身受png/zlib的限制?如何减少使用QImage保存png所花费的时间?

这里是我运行基准测试:

#include <QtGui> 
#include <QTimer> 


int 
main(int argc, char *argv[]) { 
    int times = 1000; 
    QString format("png"); 

    QByteArray ba; 
    QBuffer* buffer = new QBuffer(&ba); 
    buffer->open(QIODevice::WriteOnly); 

    QTime timer; 
    timer.start(); 

    while(times--) { 
    QImage image(800, 800, QImage::Format_RGB32); 
    image.save(buffer, format.toAscii(), -1); 
    } 

    int elapsed = timer.elapsed(); 

    qDebug() << "Completed 1000 runs in" << elapsed << "ms. (" << (elapsed/1000) << "ms/render)"; 
} 

回答

1

QImage::save(const QString & fileName, const char * format = 0, int quality = -1)第三个参数可能会帮助你。该文档说明如下:

质量因子必须在0到100或-1的范围内。指定0到 可以获取小型压缩文件,对于大型未压缩文件可获得100个文件,使用默认设置可获得 -1(默认设置)。

如果您很幸运,那么通过更改质量值,您可以更改zlib花费多少时间试图压缩图像数据。我会用各种质量值调用QImage :: save(),看看执行时间是否改变。

虽然Qt的医生说是质量must be in the range 0 to 100specify 0 to obtain small compressed files, 100 for large uncompressed fileszlib manual表现出不同的范围:基于两个范围

// Compression levels. 
#define Z_NO_COMPRESSION   0 
#define Z_BEST_SPEED    1 
#define Z_BEST_COMPRESSION  9 
#define Z_DEFAULT_COMPRESSION (-1) 

尝试值。

+1

谢谢,这指出我在正确的方向。压缩级别有所帮助,但影响最大的是将PNG滤镜设置为无。 ('png_set_filter(png_ptr,PNG_FILTER_TYPE_BASE,PNG_FILTER_NONE);')不幸的是,这是不能通过QImage修改,它看起来像我必须创建我自己的QImageWriter。 –

+0

不客气。 QPNGImageWriter('https:// qt.gitorious.org/qt/qt/blobs/4.7/src/gui/image/qpnghandler.cpp#line695')似乎没有调用png_set_filter()。这是不是意味着PNG过滤器没有? – Bill

+0

我无法从文档中找出来,但是从我的测试中明确将其设置为none时,速度要快3-4倍,所以它必须默认使用其他过滤器之一。 –

相关问题