为啥 Qt 中图像的大小会增加?
Posted
技术标签:
【中文标题】为啥 Qt 中图像的大小会增加?【英文标题】:Why is the size of image increasing in Qt?为什么 Qt 中图像的大小会增加? 【发布时间】:2014-02-17 19:03:18 【问题描述】:我正在使用它来加载图像:
QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "", tr("."));
if (fileName == "") QMessageBox::critical(this, tr("Error"), tr("Could not open File")); return; QImage img; img.load(fileName);
这是在处理后将其保存回来:
this->img.save(this->fileName);
但问题是,即使我根本不处理图像(即只是加载并保存图像),图像的大小也在增加?即使对于 ~500kb 的 png 图像,这增加了 ~5kb这对我的算法来说太高了(同一张图像大约 150kb,只经过一次迭代)。我在算法中所做的唯一操作是交换两个像素和异或。我的算法涉及多次迭代。 如何解决这个尺寸问题。 我实际上正在做一个图像加密/解密算法,这种大小的增加给我带来了严重的问题。 我在 linux mint 16 上使用 Qt 5.2。
【问题讨论】:
【参考方案1】:QImage
存储的是图像的内容,而不是文件中的表示。因此,即使您“不处理”图像,您仍然会在加载时对其进行解压缩,并将其重新压缩为文件名所暗示的任何格式。
如果图像格式使用有损压缩,您可能会在每次加载和重新保存图像时降低图像质量 - 因此应该避免。
如果图像格式使用无损压缩,则压缩系数高度依赖于内容 - 您对图像的处理将影响图像大小。
如果您希望保留图像的文件表示,您应该将文件加载到缓冲区中,并且仅在您打算更改它时对QImage
进行操作。因此:
QFile file(fileName);
if (! file.open(QIODevice::ReadOnly)) return false;
QByteArray imageData = file.readAll();
if (imageData.isEmpty()) return false;
file.close();
// process the image
QImage img;
QBuffer imageBuffer(&imageData);
imageBuffer.open(QIODevice::ReadOnly);
img.load(&imageBuffer, "JPG");
imageBuffer.close();
//
// process the image here
//
imageData.clear();
imageBuffer.open(QIODevice::WriteOnly);
img.save(&imageBuffer);
imageBuffer.close();
// save the image
QSaveFile file(fileName);
if (! file.open(QIODevice::WriteOnly)) return false;
file.write(imageData);
【讨论】:
【参考方案2】:如果您指的是文件的大小,我相信它与函数QImage::save
的quality
参数有关。最后一个:
bool QImage::save (const QString & fileName, const char * format = 0, int quality = -1) const
QImage
已经加载后,它没有最初的质量记忆,然后在保存时 Qt 将质量设为默认值,因此如果最初的图像质量低于默认值,可能会导致文件大小稍微增加。 (此外,在无损格式的情况下,如 .png 质量似乎意味着压缩文件的强度)
【讨论】:
以上是关于为啥 Qt 中图像的大小会增加?的主要内容,如果未能解决你的问题,请参考以下文章