【问题标题】: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。
【问题讨论】:
标签:
image
qt
image-processing
filesize
【解决方案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 质量似乎意味着压缩文件的强度)