我用它来加载图片:
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。
答案 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这样的丢失格式的情况下,似乎意味着文件的压缩程度如何)