为什么Qt中图像的大小会增加?

时间:2014-02-17 19:03:18

标签: image qt image-processing filesize

我用它来加载图片:

  

QString fileName = QFileDialog :: getOpenFileName(this,tr(“Open File”),   “”,tr(“”));

if (fileName == "")
{
    QMessageBox::critical(this, tr("Error"), tr("Could not open File"));
    return;
}
QImage img;
img.load(fileName);

这是为了在处理它之后将其保存回来:

this->img.save(this->fileName);

但问题是,即使我根本不处理图像,即只是加载和保存图像,图像的大小也在增加?
即使这是~~ 5kb的png图像~~ 500kb对于我的算法来说太高了(对于相同的图像,仅经过一次迭代后约为150kb)。我在算法中做的唯一操作是交换两个像素和XORing。我的算法涉及多次迭代 如何解决这个尺寸问题 我实际上在做一个图像加密/解密算法,这种尺寸的增加给我带来了严重的问题 我在linux mint 16上使用Qt 5.2。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

如果你的意思是文件的大小,我认为它与函数quality的{​​{1}}参数有关。最后一个:

  

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

QImage::save已加载后,它没有最初的质量内存,然后保存Qt使质量默认,所以如果图像质量最初低于默认值,可能会导致文件大小增加一点。 (同样在像.png这样的丢失格式的情况下,似乎意味着文件的压缩程度如何)