Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QImage::save() проблема


Автор: toxx 11.6.2012, 02:04
Добрый день,
есть проблема, реализую алгоритм LSB, меняю последний бит у R G B компонент картинки на биты моего кодируемо изображения.
Потом достаю это изображение.
Проблема в том, что 
1. Если кодировать данные в картинку->сохранять картинку с данными->загружать картинку и раскодировать данных,
получается жесткое искажение данных(пережимает как-то Qt?).

2. Если же не сохранять картинку, то всё отлично раскодировается.

Кодирую-декодирую так для случая 2
Код
 //оригинальнальное изображение, img - вставляемое
#define FORMAT "jpg"
            QImage corruptedImage(imageHelper->algorithmLSB(originalPicture,img,leastBits));
            QImage from(imageHelper->getImageFromLSB(corruptedImage,img.width(),img.height(),leastBits));
            from.save(fn,FORMAT);


Для случая 1 так
Код

#define FORMAT "jpg"
//save
            QImage corruptedImage(imageHelper->algorithmLSB(originalPicture,img,leastBits));
            corruptedImage.save(fn,FORMAT);
// открываю так
            QString fileName = QFileDialog::getOpenFileName(this,
                                          tr("Open File"), QDir::currentPath());
            if (!fileName.isEmpty()) {
                QImage image(fileName);
                if (image.isNull()) {
                    QMessageBox::information(this, tr("Image Viewer"),
                                             tr("Cannot load %1.").arg(fileName));
                    return;
                }
             }
//load decode, img это сохранённая картинка          
            QImage from(imageHelper->getImageFromLSB(image,w,h,leastBits));
            from.save(FROM_LSB,FORMAT);


В чем может быть проблема? 
Если в 1м случае сохранять оригинальную картинку, то она пережимается иногда в 2 раза, иногда на ~100kb.
Хотя изменены мной только компоненты RGB, через setPixel(x,y,QRgb).

Спасибо за любую помощь.

Автор: borisbn 11.6.2012, 10:45
Цитата(toxx @  11.6.2012,  02:04 Найти цитируемый пост)
 if (!fileName.isEmpty()) {
                QImage image(fileName);     // <----------------------------------------------
                if (image.isNull()) {
                    QMessageBox::information(this, tr("Image Viewer"),
                                             tr("Cannot load %1.").arg(fileName));
                    return;
                }
             }

в помеченной строке создаётся временный объект QImage, который разрушится при выходе из if (!filename.isEmpty())

Цитата(toxx @  11.6.2012,  02:04 Найти цитируемый пост)
 QImage from(imageHelper->getImageFromLSB(image,w,h,leastBits));

а здесь используется уже какой-то другой image

Это раз.

Сохранение картинки в jpg происходит с искажением (с потерей). Если нужно сохранить картинку один в один - используй BMP или PNG.
Это два.

А вообще - очень сумбурный пост: какие-то куски кода... какие-то два варианта... Я вообще не очень понял, что ты хочешь сделать и как это реализуешь.
Это три.

Автор: toxx 12.6.2012, 23:45
borisbn
Прошу прощения, пост был действительно сумбурный. Ночью сидел... постараюсь так больше не делать.

Тут
Код

в помеченной строке создаётся временный объект QImage, который разрушится при выходе из if (!filename.isEmpty())


И тут всё очевидно, просто неудачно пост скомпоновал=)
Код

а здесь используется уже какой-то другой image


Вот ответ, не думал что кодирование из jpg в jpg происходит с потерей. Взял BMP всё отлично. Спасибо!
Код

Сохранение картинки в jpg происходит с искажением (с потерей). Если нужно сохранить картинку один в один - используй BMP или PNG.
Это два.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)