2014-02-17 3 views
0

Я использую это, чтобы загрузить изображение:Почему размер изображения увеличивается в Qt?

QString имя_файла = QFileDialog :: GetOpenFileName (это, Т.Р. ("Open File"), "", Тр ("").);

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-изображения ~ 500 кбайт, это слишком высоко для моего алгоритма (~ 150 кб для одного и того же изображения, после одной итерации). Единственные операции, которые я выполняю в моем алгоритме, - это обмен двумя пикселями и 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

Если вы имеете в виду размер файла, я считаю, что он должен делать с quality параметром функции QImage::save. Последний из них:

BOOL QImage :: сохранить (Const QString & имя_файла, Const символ * Формат = 0, внутр качество = -1) Const

После QImage уже загружен не имеет памяти качества, которое у него было первоначально, а затем при сохранении Qt делает качество по умолчанию, поэтому, если качество изображения изначально было ниже, чем по умолчанию, это может привести к увеличению размера файла. (Также в случае безформатных форматов, таких как .png качество, похоже, означает, насколько сильно сжатый файл)

Смежные вопросы