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

Image 为什么图像的大小在Qt中增加?,image,qt,image-processing,filesize,Image,Qt,Image Processing,Filesize,我正在使用它加载图像: QString fileName=QFileDialog::getOpenFileName(这个,tr(“打开文件”), “,tr(“.”) 在处理后,此选项用于将其保存回: 但问题是,即使我根本不处理图像,即简单地加载并保存图像,图像的大小也在增加?即使对于500kb的png图像,图像大小增加了约5kb,但对于我的算法来说,图像大小太大了(对于同一图像,仅经过一次迭代后,图像大小增加了约150kb)。我在算法中所做的唯一操作是交换两个像素和XORing。我的算法涉及多次

我正在使用它加载图像:

QString fileName=QFileDialog::getOpenFileName(这个,tr(“打开文件”), “,tr(“.”)

在处理后,此选项用于将其保存回:

但问题是,即使我根本不处理图像,即简单地加载并保存图像,图像的大小也在增加?
即使对于500kb的png图像,图像大小增加了约5kb,但对于我的算法来说,图像大小太大了(对于同一图像,仅经过一次迭代后,图像大小增加了约150kb)。我在算法中所做的唯一操作是交换两个像素和XORing。我的算法涉及多次迭代。
如何解决这个大小问题。
事实上,我正在做一个图像加密/解密算法,而这种大小的增加给我带来了严重的问题。

我在linux mint 16上使用Qt 5.2。

如果您指的是文件的大小,我相信它与
质量
函数的参数
QImage::save
有关。最后一点:

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


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

A
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);
this->img.save(this->fileName);
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);