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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...  (Прочитано 14625 раз)
daenux
Гость
« : Февраль 09, 2011, 09:40 »

Товарищи, не удаеться записать в поле bytea изображение, пытаюсь записать следующем образом:

Код:
// Создание и установление связи между объектами
QByteArray *qByteArray = new QByteArray();
QBuffer *qBuffer = new QBuffer(qByteArray, this);
QDataStream *qDataStream = new QDataStream(qBuffer);

qDebug() << qByteArray->count(); // Выводиться 0
if (qImage.byteCount != 0)
{ // Заходит в этот блок
  qBuffer->open(QIODevice::WriteOnly);
  qImage.save(qDataStream->device);
  qBuffer->close();
}
qDebug() << qByteArray->count(); // Выводиться 0
Записан
Fat-Zer
Гость
« Ответ #1 : Февраль 09, 2011, 09:59 »

не хватает чего-то вроде
Код
C++ (Qt)
qImage.save(&qBuffer, "PNG");
Записан
daenux
Гость
« Ответ #2 : Февраль 09, 2011, 10:01 »

Да нееет, объект диначиеский - да и формат указывать не обязательно, он ведъ в байты конвертируеться...
Записан
BRE
Гость
« Ответ #3 : Февраль 09, 2011, 10:07 »

да и формат указывать не обязательно, он ведъ в байты конвертируеться...
А тип графического файла, в который нужно сохранить эту картинку, программа определяет телепатически...  Подмигивающий
Записан
daenux
Гость
« Ответ #4 : Февраль 09, 2011, 10:12 »

Верно, простите пожалуйста...

С указанием формата графического изображения все работает! Улыбающийся
Записан
daenux
Гость
« Ответ #5 : Февраль 09, 2011, 10:43 »

А вот теперь считывание, и сново я что то делаю не так:

Код:
qBuffer->open(QIODevice::WriteOnly);
qBuffer->setData(qSqlQuery->value(qSqlQuery->record().indexOf("PHOTO")).toByteArray());
qBuffer->close();

if (qByteArray->count() !=0)
{// Сюда не заходит
  qImage.laod(*qByteArray, "JPEG");
}

Я правильно записываю в qBuffer?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #6 : Февраль 09, 2011, 11:12 »

1. Убери нафиг создание в куче.
2. qImage.load (qSqlQuery.value(qSqlQuery.record().indexOf("PHOTO")).toByteArray());
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Fat-Zer
Гость
« Ответ #7 : Февраль 09, 2011, 11:22 »

А тип графического файла, в который нужно сохранить эту картинку, программа определяет телепатически...  Подмигивающий
При чтении из файла - да. Веселый
1. Убери нафиг создание в куче.
2. qImage.load (qSqlQuery.value(qSqlQuery.record().indexOf("PHOTO")).toByteArray());
1. согласен
2. опять же указать формат... или здесь он сам угадает?
« Последнее редактирование: Февраль 09, 2011, 11:25 от Fat-Zer » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #8 : Февраль 09, 2011, 11:35 »

bool QImage::loadFromData ( const QByteArray & data, const char * format = 0 )
Т.е. должен сам.
Записан

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

Обнаруживаються две странности, первая:

Код:
qDebug() << qSqlQuery->record().indexOf("PHOTO")).toByteArray().count(); // 12868
qImage.laod(qSqlQuery->value(qSqlQuery->record().indexOf("PHOTO")).toByteArray(), "JPEG");
qDebug() << qImage.byteCount(); // 0 - Почему?

И вторая связанна с тем, что при записи в БД изображения, мы отправляли 9660 байт, а при считывании получаем 12868 (изображение одно и то же, как и формат)...
Записан
daenux
Гость
« Ответ #10 : Февраль 09, 2011, 11:38 »

Пантер - Указание формата ничего не дает, проверял - но все же формат при load я указываю на всякий...
« Последнее редактирование: Февраль 09, 2011, 11:44 от daenux » Записан
daenux
Гость
« Ответ #11 : Февраль 09, 2011, 11:47 »

Если использовать функцию loadFromData, тогда то же самое получаеться:

Код:
qImage.laodFromData(qSqlQuery->value(qSqlQuery->record().indexOf("PHOTO")).toByteArray(), "JPEG");
Записан
daenux
Гость
« Ответ #12 : Февраль 09, 2011, 12:53 »

У когонибуть вообще есть пример записи и считывания из bytea каких либо объектов?
Записан
daenux
Гость
« Ответ #13 : Февраль 09, 2011, 13:08 »

Дело вот в том, что QImage, говарит что изображение состоит из 256000 байт, затем это дело переходит в QByteArray, каторый в свою очередъ говарит что он содержит 9650 байт...

Этот момент не яснет, может ли кто разьяснить?
Записан
Luck
Гость
« Ответ #14 : Февраль 10, 2011, 09:52 »

У самого сейчас возникла та же проблема, удалось решить. Вот код.

Код:
    QFile file("before.png");
    file.open(QIODevice::ReadOnly);
    QByteArray baToSend = file.readAll();

    query.prepare("insert into \"images\" (img) values (:img)");
    query.bindValue(":img",baToSend);
    qDebug() << "exec send query: " << query.exec();

    query.clear();
    qDebug() << "exec save query: " << query.exec("select \"img\" from \"images\"");
    query.first();

    QByteArray baToSave = query.record().value("img").toByteArray();


    QImage imgToSave;
    qDebug() << "load from bytearray: "<< imgToSave.loadFromData(baToSave, "png");
    qDebug() << "saving: " << imgToSave.save("after.png","png",100);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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