Russian Qt Forum
Ноябрь 27, 2024, 22:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QImage в QDataStream  (Прочитано 12442 раз)
jatsuk
Гость
« : Сентябрь 20, 2011, 15:14 »

Помогите люди

Есть изображение bmp
QImage image(fileName);

Нужно его сохранить бинарно.
При диалоге сохранения выбираю название
fileNamesave="111.bmp"


Облазил весь форум .. куча тем про бинарное сохранения, но в основном сохраняют текст...
Нашел что то похожее, но помоему это бред. НА выходе файл bmp размером 64 , который просит открыть фотошопом, а при стандартном просмотре ошибка.


Код:
 QFile file (fileNamesave);
                if (file.open(QIODevice::WriteOnly )){

                    QTextStream out(stdout);
                    QTextCodec *concodec = QTextCodec::codecForName("CP-866");
                    out.setCodec(concodec);



                   QDataStream stream(&file);
                   stream.setVersion(QDataStream::Qt_4_7);
                   stream << image;
                  }


     file.close();


Нашел более адекватный вариант, перевести это изображение в QByteArray и сохранить.
Незнаю правильно ли я это сделал... но на выходе файл 4 байта (Где то читал что они  и так должны туда писаться следовательно ничего не записалось Подмигивающий)

Код:
 QByteArray ba;

image.loadFromData(ba);
//image.loadFromData(QByteArray::fromBase64(ba));


 QFile file (fileNamesave);
            if (file.open(QIODevice::WriteOnly )){

                QTextStream out(stdout);
                QTextCodec *concodec = QTextCodec::codecForName("CP-866");
                out.setCodec(concodec);

               QDataStream stream(&file);
               stream.setVersion(QDataStream::Qt_4_7);
               stream << ba;
              }
file.close();

Так как сохранить это изображение так Непонимающий
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 20, 2011, 15:18 »

bool QImage::save ( QIODevice * device, const char * format = 0, int quality = -1 ) const
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
jatsuk
Гость
« Ответ #2 : Сентябрь 20, 2011, 15:43 »

спс, но нужно бинарно сохранить
Пишу кодирование

Так ка вы сказали уже сохранял, но возникла проблемма
QImage image2(width_im, height_im, QImage::Format_RGB32);
bool saved = image2.save(fileNamesave, "BMP");

Изображение из которого сохранялось весило 157, а новое стало 468
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Сентябрь 20, 2011, 16:13 »

Исходное видимо jpg было? Читай про графические форматы .
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
jatsuk
Гость
« Ответ #4 : Сентябрь 20, 2011, 16:25 »

Исходное было bmp RGB32, про форматы уже читал.

Но лучше бы подсказал, что в коде не так, как бинарно сохранить. А то на быдлере сделано а в Qt сделать не могу
Записан
slim
Гость
« Ответ #5 : Сентябрь 20, 2011, 17:41 »

Попробуй для начала открыть файл как бинарный, а не WriteOnly, для этого используй параметры для открытия 'wb'
Записан
jatsuk
Гость
« Ответ #6 : Сентябрь 21, 2011, 11:44 »

Зачем мне его окрывать как бинарный ?? люди и так пишут вроде работает

Придумал способ, сложно нудно, но думаю можно....

Суть такова - изображение это набор точек rgb.

В моей программе эти точки уже считаны.
Что если перевести каждую точку в двоичное число и прям так сохранить Непонимающий
Подскажите что лучше использовать?

QByteArray ba; и его потом
  QDataStream stream(&file);
               stream.setVersion(QDataStream::Qt_4_7);
               stream << ba;

Так получится ?
Записан
slim
Гость
« Ответ #7 : Сентябрь 21, 2011, 13:04 »

>> Зачем мне его окрывать как бинарный ??

потомучто у тебя могут встретиться разные групы символов, например "\n"  в текстовом и бинарном виде эти символо транслируються по разному! Вообщем, бинарные данны в текстовый файл сохранять ерись.
Записан
jatsuk
Гость
« Ответ #8 : Сентябрь 22, 2011, 11:55 »

Я записываю int числа только, откуда там такое )
Записан
Prm
Гость
« Ответ #9 : Сентябрь 22, 2011, 12:53 »

 QImage::save и есть бинарное сохранение. Пантер правильно сказал, косяк в форматах. Тренеруйтесь на реальном файле, не надо велосипед изобретать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 22, 2011, 13:03 »

Нужно его сохранить бинарно.
"бинарно" всего лишь значит "нечитабельно", поэтому трудно догадаться что нужно  Улыбающийся
Неясно почему Вы не хотите использовать QImage::save. Ну ладно, то Ваше дело, тогда изобретите свой формат, напр

Код
C++ (Qt)
QFile file(file);
if (file.open(QFile::WriteOnly | QFile::Truncate)) {
QDataStream strm(&file);
strm << image.width() << image.height();  
file.write((const char *) image.bits(), qint64(image.bytesPerLine()) * image.height());
}
 
Это извращение может иметь смысл если хочется читать image максимально быстро, ну или он не должен просматриваться сторонним вьюером
Записан
jatsuk
Гость
« Ответ #11 : Сентябрь 23, 2011, 13:22 »

Сделал через save всё таки.
С форматами так и не разобрался, но сделал следуещее:
Сохранил мой BMP со всеми теми же пикселями в новый BMP QImage::Format_RGB32 (было 176 стало 468)
Далее использовал уже новое  изображение (весом 468), его пиксели изменял и всё норм теперь оно не стало больше весить , всё равно 468...

А на счёт изобретения велосипеда... Это первая лаба по кодированию (1 стадия алгоритма JPEG, мы свой дмипег пишем. RGB в YCrCb ).
И этот файл нужно было бинарно сохранить в файл, чтобы последующие программы (в которых остальные части алгоритма) считывали данные из бинарного файла и продолжали свои дейтсвия...

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

P.S. 3 дня убил на то, чтобы понять почему изображение восстанавливается в неправильном цвете Подмигивающий
оказалось, что на сайте неправильный RGB в YCrCb алгоритм написан. Вторая и 3 строчка перепутана. и нет знака минуса перер 0.0168.... на остальных сайтах вроде нормально. Это так, вдруг кто нибудь подобное будет делать )

Спасибо всем за идеи
« Последнее редактирование: Сентябрь 23, 2011, 13:24 от jatsuk » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #12 : Сентябрь 23, 2011, 13:51 »

Сохранил мой BMP со всеми теми же пикселями в новый BMP QImage::Format_RGB32 (было 176 стало 468)
Дайте оригинальный bmp посмотреть.
Может он не 32 битный или с RLE сжатем (последнего встречается редко и поддерживается не всеми программами, но формат допускает).
Записан
jatsuk
Гость
« Ответ #13 : Сентябрь 23, 2011, 14:58 »

Запись в файл сделал...  просто записав все 3 параметра цветности через пробел в TXT. Думаю этого хватит )

Код:
QFile file("fail.txt");
             if ( !file.open(QIODevice::WriteOnly) )
                 return;
   QTextStream stream(&file);
   for (int i=0; i<height_im; i++)
   for (int j=0; j<width_im; j++)    {
   int rint= red[i][j];
   int gint= green[i][j];
   int bint= blue[i][j];
   QString rtxt = QString::number(rint);
   QString gtxt = QString::number(gint);
   QString btxt = QString::number(bint);
   stream << rtxt << " ";
   stream << gtxt<< " ";
   stream << btxt << " ";
   }


Вот BMP файлы...

Первый это сохраненное в пейнте как 256 цветный рисунок bmp
Второй qt QImage::Format_RGB32

Я думал , что это одно и то же.... но это похоже не так )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 23, 2011, 17:31 »

Запись в файл сделал...  просто записав все 3 параметра цветности через пробел в TXT. Думаю этого хватит )
Надо было просто сказать напр "держу изображение в своем формате/массивах" - а не морочить людям голову с QImage который здесь ни при чем. Ну а с текстом зачем связались? Не жалко машины и места на диске?

Код
C++ (Qt)
 int rowSize = sizeof(red[0][0]) * width_im;
 for (int i=0; i<height_im; i++) {
    file.write((char *) &red[i][0], rowSize);
    file.write((char *) &green[i][0], rowSize);
    file.write((char *) &blue[i][0], rowSize);
 }
 
И слово "бинарный" больше не употребляйте
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 23.