2014-02-17 45 views
0

我使用此加載圖像:爲什麼圖像大小在Qt中增加?

QString的文件名= QFileDialog :: getOpenFileName(此,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,僅僅一次迭代後)。我在我的算法中做的唯一操作是交換兩個像素和XORing。我的算法涉及多次迭代。
如何解決此問題的大小。
我實際上是在做一個圖像加密/解密算法,這種大小的增加對我造成了嚴重的問題。
我使用Qt 5.2的Linux Mint的16

回答

1

A 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); 
0

如果你指的是文件的大小,我相信這與功能QImage::savequality參數來完成。最後一個:QImage已經被加載

布爾的QImage ::保存(常量QString的&文件名,爲const char *格式= 0,INT質量= -1)const的

後,它沒有記憶最初的質量,然後保存Qt使質量默認,所以如果圖像質量最初低於默認值,它可能會導致文件大小略有增加。 (同樣在png質量等無損格式的情況下,似乎意味着壓縮文件的強度如何)