Russian Qt Forum

Qt => Базы данных => Тема начата: daenux от Февраль 09, 2011, 09:40



Название: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: 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


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: Fat-Zer от Февраль 09, 2011, 09:59
не хватает чего-то вроде
Код
C++ (Qt)
qImage.save(&qBuffer, "PNG");


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и сm
Отправлено: daenux от Февраль 09, 2011, 10:01
Да нееет, объект диначиеский - да и формат указывать не обязательно, он ведъ в байты конвертируеться...


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и сm
Отправлено: BRE от Февраль 09, 2011, 10:07
да и формат указывать не обязательно, он ведъ в байты конвертируеться...
А тип графического файла, в который нужно сохранить эту картинку, программа определяет телепатически...  ;)


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: daenux от Февраль 09, 2011, 10:12
Верно, простите пожалуйста...

С указанием формата графического изображения все работает! :)


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: daenux от Февраль 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?


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и сm
Отправлено: Пантер от Февраль 09, 2011, 11:12
1. Убери нафиг создание в куче.
2. qImage.load (qSqlQuery.value(qSqlQuery.record().indexOf("PHOTO")).toByteArray());


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и сm
Отправлено: Fat-Zer от Февраль 09, 2011, 11:22
А тип графического файла, в который нужно сохранить эту картинку, программа определяет телепатически...  ;)
При чтении из файла - да. :D
1. Убери нафиг создание в куче.
2. qImage.load (qSqlQuery.value(qSqlQuery.record().indexOf("PHOTO")).toByteArray());
1. согласен
2. опять же указать формат... или здесь он сам угадает?


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: Пантер от Февраль 09, 2011, 11:35
bool QImage::loadFromData ( const QByteArray & data, const char * format = 0 )
Т.е. должен сам.


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: daenux от Февраль 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 (изображение одно и то же, как и формат)...


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и сm
Отправлено: daenux от Февраль 09, 2011, 11:38
Пантер - Указание формата ничего не дает, проверял - но все же формат при load я указываю на всякий...


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: daenux от Февраль 09, 2011, 11:47
Если использовать функцию loadFromData, тогда то же самое получаеться:

Код:
qImage.laodFromData(qSqlQuery->value(qSqlQuery->record().indexOf("PHOTO")).toByteArray(), "JPEG");


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: daenux от Февраль 09, 2011, 12:53
У когонибуть вообще есть пример записи и считывания из bytea каких либо объектов?


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: daenux от Февраль 09, 2011, 13:08
Дело вот в том, что QImage, говарит что изображение состоит из 256000 байт, затем это дело переходит в QByteArray, каторый в свою очередъ говарит что он содержит 9650 байт...

Этот момент не яснет, может ли кто разьяснить?


Название: Re: Запись изображения (QImage) в поле BYTEA (PostgreSQL), а затем и считывание...
Отправлено: Luck от Февраль 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);