如何在使用QImage保存PNG时减少时间?

4
使用Qt 4.8rc1,我有一个QImage想转换为png文件。似乎将其转换为png格式所需的时间比预期更长:对于一个800x800的空png,需要大约70毫秒。是否有方法可以使此过程更有效率,或者我只是受到png/zlib的固有限制?
这是我正在运行的基准测试:
#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个回答

3
QImage::save(const QString & fileName, const char * format = 0, int quality = -1)的第三个参数可能会对您有所帮助。文档如下所述:
质量因素必须在0到100或-1的范围内。指定0可获取小型压缩文件,指定100可获取大型未压缩文件,指定-1 (默认值) 可使用默认设置。
如果您很幸运,通过更改quality的值,可以改变zlib花费在尝试压缩图像数据上的时间。我建议尝试使用不同的quality值调用QImage::save()函数,然后查看执行时间是否发生变化。
尽管Qt文档说quality“必须在0到100的范围内”,并且“指定0可获得小型压缩文件,100用于大型未压缩文件”,但zlib手册显示的范围不同。
// 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。 - Michael Nutt
不客气。QPNGImageWriter(https://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/image/qpnghandler.cpp#line695)似乎没有调用png_set_filter()。这难道不意味着PNG过滤器是无? - Bill
我无法从文档中找到答案,但是通过我的测试,当明确将其设置为“none”时,速度要快得多(3-4倍),因此它必须默认为其他过滤器之一。 - Michael Nutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接