为啥 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::savequality 参数有关。最后一个:

bool QImage::save (const QString & fileName, const char * format = 0, int quality = -1) const

QImage 已经加载后,它没有最初的质量记忆,然后在保存时 Qt 将质量设为默认值,因此如果最初的图像质量低于默认值,可能会导致文件大小稍微增加。 (此外,在无损格式的情况下,如 .png 质量似乎意味着压缩文件的强度)

【讨论】:

以上是关于为啥 Qt 中图像的大小会增加?的主要内容,如果未能解决你的问题,请参考以下文章

Qt中图像的显示与基本操作

calc() 是不是适用于 CSS 中图像的背景大小?

根据列表中图像的数量按比例调整动态图像列表的大小

如何更改启动画面中图像的大小?

MATLAB中图像的对角线像素

如何使节点画布中图像的大小始终为 128 像素