Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Builder-Access-SQL. Как работать с изображениями? Как занести и вытащить изображения? 
:(
    Опции темы
Bodro
Дата 16.2.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 2
Всего: 4



Добрый день!
Скажите, пожалуйста, как мне в базу MS Access занести изображение?
Хотелось бы получить пример запроса.
А так же как потом это изображение вытащить?

Примеры.
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_hunter
Дата 16.2.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bodro
Дата 17.2.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 2
Всего: 4



Спасибо! Тему можно закрывать!
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Bodro
Дата 19.2.2006, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 2
Всего: 4



Нет уж, позвольте открыть тему снова. Полазил я по ссылкам, по сети, и ничего не нашёл работающего. У меня хоть как-то работает следующий код:
Код

.........
    // Используется компонент TQuery, т.е. TQuery *QueryBeemeterDB;

    // Сохранение изображения в базе данных MS Access
    TMemoryStream *BmpStream = new(TMemoryStream);
    BmpStream->LoadFromFile("BMP.BMP");
    BmpStream->Seek(0,0);
    QueryBeemeterDB->Close();
    QueryBeemeterDB->SQL->Clear();
    QueryBeemeterDB->SQL->Add("INSERT INTO main (name, picture) VALUES(:nme, :bmp)");
    QueryBeemeterDB->ParamByName("nme")->Value = OpenPictureDialogBee->FileName;
    QueryBeemeterDB->ParamByName("bmp")->LoadFromStream(BmpStream, ftGraphic);
    QueryBeemeterDB->ExecSQL();

    // Показ изображения, взятого из базы данных MS Access
    BmpStream->Clear();
    QueryBeemeterDB->Close();
    QueryBeemeterDB->SQL->Clear();
    QueryBeemeterDB->SQL->Add("SELECT * FROM main");
    QueryBeemeterDB->Open();
    BmpStream->LoadFromStream(
               QueryBeemeterDB->CreateBlobStream(
                                 QueryBeemeterDB->FieldByName("picture"), bmRead));
    BmpStream->Seek(0,0);
    ImagePicture->Picture->Bitmap->LoadFromStream(BmpStream);
.........

Вот этот код хоть как-то работает. Только не так, как надо! что-то, несомненно, заносится в базу.
А когда берётся изображение из базы, то на экран выводится не всё изображение, а только кусок. Причём маленький. Т.е. Если в качестве изображения брать красный квадрат 199*176 (т.е. просто изображение - красный фон), записать его в базу (см. код выше) и вывести (см. код выше), то на экране появится изображение размером 199*176, но видно будет только примерно 1/3. Внизу красный цвет, а вверху (примерно 2/3) - чёрный.

Какие можно сделать выводы? Изображение записывается. Причём размер правильный. Изображение выводится, но не всё. Т.е. с базой работа идёт. С потоками, вроде, всё тоже нормально. Так, например, если написать код:
Код

.........
    TMemoryStream *BmpStream = new(TMemoryStream);
    BmpStream->LoadFromFile("BMP.BMP");
    ImagePicture->Picture->Bitmap->LoadFromStream(BmpStream);
.........

то появится нормальное изображение.

В чём проблема? Кто-то может уже сталкивался с такой неприятностью? Проект сдавать надо, а я не могу изображение сохранить/вытащить из базы.

-----------------
Использую: Windows XP, Borland C++ Builder 6, MS Access 2003 (база формата Access 2000).

Это сообщение отредактировал(а) Bodro - 19.2.2006, 23:40
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_hunter
Дата 20.2.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



попробуй при записи в базу указать тип не ftGraphic а какой-нить ftBLOB ( если есть )
+ не пиши/читай сразу в картинку -- запиши в файл -- посмотри что записалось


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bodro
Дата 20.2.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 2
Всего: 4



Я, вроде, пробовал. Попробую ещё...

Попробовал. Таже ерунда. Ничего не изменилось. ftGraphics, ftBlob - только часть изображения. ftMemo, ftByte - вообще ошибка.

А в файл-то какой смысл писать? Какая разница - поток в файл выводить или на Image? Чисто теоретически, ничего не долно измениться. Однако... Происходят странные вещи... smile Вот код:
Код

.........
    // Начало смотри выше. Просто привожу изменения.
    // Тут использую ftBlob (см. строку 12 в коде выше (предыдущий мой пост))
    QueryBeemeterDB->ParamByName(L"bmp")->LoadFromStream(BmpStream, ftBlob);
.........
    // Теперь вывожу содержимое потока на Image и записываю в файл
    // (см. код выше начиная со строки 25 (предыдущий мой пост))
    ImagePicture->Picture->Bitmap->LoadFromStream(BmpStream);
    BmpStream->Seek(0,0);
    BmpStream->SaveToFile("RTM.BMP");
.........

Получается бред! Изображение выводится то же самое (т.е. опять 1/3 нормально, остальное чёрное (см. выше)), а в файл вообще непонятно что пишется. Открываю в Paint - чистый лист. Открывю ACDSee v3.1 - в виде маленьких превью иконок - просто чёрное изображение, а когда начинаю его просматривать - тоже, что и на Image - часть красна, часть чёрная. Размер нормального исходного файла (BMP.BMP) равен 105654, а размер RTM.BMP равен 32769. Что вообще творится-то???

Ладно, пробую по другому:
Код

.........
    // Начало смотри выше. Просто привожу изменения.
    // Тут теперь использую ftGraphic (см. строку 12 в коде выше (предыдущий мой пост))
    QueryBeemeterDB->ParamByName(L"bmp")->LoadFromStream(BmpStream, ftGraphic);
.........
    // Теперь вывожу содержимое потока на Image и записываю в файл
    // (см. код выше начиная со строки 25 (предыдущий мой пост))
    ImagePicture->Picture->Bitmap->LoadFromStream(BmpStream);
    BmpStream->Seek(0,0);
    BmpStream->SaveToFile("RTM.BMP");
.........

И тут тоже самое. Как будто ничего не изменилось!
ПОМОГИТЕ!!! что происходит-то??? smile
Размер полученного файла 32769. А ведь 2 в степени 15 - 32768. Может тут кроется разгадка? Подскажите, кто знает или хоть что-то думает.

Это сообщение отредактировал(а) Bodro - 20.2.2006, 13:40
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_hunter
Дата 20.2.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



в файл нужно писать не для того, чтобы его потом пэинтами открывать, а для того, чтобы побайтно сравнить м оригиналом. что это сравнение дает?
+ какой тип имеет поле картинки в базе?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bodro
Дата 20.2.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 2
Всего: 4



Скажи мне, друг! Ты вообще умеешь нормально отвечать на вопросы и думать?
Цитата

в файл нужно писать не для того, чтобы его потом пэинтами открывать, а для того, чтобы побайтно сравнить м оригиналом. что это сравнение дает?

Блин, нахрена его сравнивать если и так видно, что вытаскивается заголовок и следующая за ним матрица. Размер данных 32769 байт. Если файл меньше - то всё нормально. Если файл больше, то только 32769 байт. Я всё же писал!!! Зачем сравнивать, если и так видно, что выводится не всё!
матрица выводится снизу вверх справа налево. Из всего этого следует, что выводится заголовок и начало матрицы. А ты какой-то бред несёшь! Зачем сравнивать побитово???

И ещё:
Цитата

+ какой тип имеет поле картинки в базе?

Ты вообще сам-то как думаешь? Наверное Дата/Время, да? Или числовой...
Блин, для картинки в Access'е кроме "Поле объекта OLE" больше нет типов.
Ты бы лучше отвечал на вопрос, чем херню нести. Или молчал бы...

По образованию ты хоть кто?
Как ты вообще смог поднять себе репутацию? Тебе что, делать нечего? Сидишь всеми днями на форуме и какую-то ерунду несёшь. Ведь ты ничего по делу не сказал!
Лучше бы программирование изучал, чем на форуме бред нести.

P.S. прости за грубый тон, но эти сообщения - предел моего терпения!!! smile


P.P.S. Кто-нибудь ещё сталкивался с подобной проблемой?
В чём хоть загвоздка? Немогу выяснить, на каком этапе происходит потеря данных... Помогите, пожалуйста!!! Только давайте по существу!

Это сообщение отредактировал(а) Bodro - 20.2.2006, 18:24
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_hunter
Дата 20.2.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Цитата(Bodro @ 20.2.2006, 17:23 Найти цитируемый пост)
Блин, нахрена его сравнивать если и так видно, что вытаскивается заголовок и следующая за ним матрица. Размер данных 32769 байт.

и откуда это видно ( из постов, идущих перед моим )?
Цитата(Bodro @ 20.2.2006, 17:23 Найти цитируемый пост)
Зачем сравнивать побитово???

действительно. зачем? ( и где я такое предлагал )?

Цитата(Bodro @ 20.2.2006, 17:23 Найти цитируемый пост)
Блин, для картинки в Access'е кроме "Поле объекта OLE" больше нет типов.

у типа "Поле объекта OLE" нет ограничения в ~~32K. поэтому я и спрашивал про тип.

Цитата(Bodro @ 20.2.2006, 17:23 Найти цитируемый пост)
По образованию ты хоть кто?
Как ты вообще смог поднять себе репутацию? Тебе что, делать нечего? Сидишь всеми днями на форуме и какую-то ерунду несёшь. Ведь ты ничего по делу не сказал!
Лучше бы программирование изучал, чем на форуме бред нести.

на риторические вопросы я обычно не отвечаю...

Цитата(Bodro @ 20.2.2006, 17:23 Найти цитируемый пост)
Немогу выяснить, на каком этапе происходит потеря данных..

это еще одна причина для чтения/записи из/в файл миную промежуточные компоненты


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.4497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.