Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

BLOB, Jpeg, FireBird, FIBPLus   Найти похожие ветки 

 
Fants   (2003-11-19 14:52) [0]

Всем привет ! Вопрос такой: Есть таблица с полем BLOB для хранения фото. Через IBExpert сохранил в этом поле картинку формата Jpg. В программе через TpFIBDataSet задаю SelectSQL со всеми полями из этой таблицы, а когда создаю объекты-поля через Fields Editor вылетает ошибка о том что "Bitmap image is not valid", Возникает вопрос, как же работать с файлами формата jpg в базе данных.


 
Fants   (2003-11-19 15:23) [1]

Ребятки, очень нужно ПОМОГИТЕ


 
Johnmen ©   (2003-11-19 15:24) [2]

В БД нет никаких файлов, никаких форматов файлов. А есть BLOB поля, в которых может храниться всё, что угодно. Хоть bmp, хоть jpg, хоть exe, хоть "Война и мир"...


 
Fants   (2003-11-19 15:29) [3]

Ответ понятен. Но где решение проблемы , что делать ? Что за ошибка.


 
Johnmen ©   (2003-11-19 15:33) [4]

Ошибка из-за того, что иытаешься, явно или нет, "посмотреть" на BLOB поле, как на bmp.
Что указываешь при "создаю объекты-поля через Fields Editor вылетает ошибка о том что "Bitmap image is not valid",... " ?


 
Fants   (2003-11-19 15:40) [5]

В контестном меню Fields Editor указываю Add All Fields, при этом есть DBImage связанный с DataSource FIBDataSet, ошибка вылетает также при открытии набора данных


 
Johnmen ©   (2003-11-19 15:45) [6]

Убери DBImage, и ошибка исчезнет :)


 
Fants   (2003-11-19 15:48) [7]

А как мне фото посмотреть то :))))


 
Romkin ©   (2003-11-19 15:57) [8]

А вот это вопрос :) uses JPeg в interface секции не помогает?
Скорее всего нет. Отсюда вывод - использовать обычный TImage


 
Fants   (2003-11-19 16:04) [9]

>Отсюда вывод - использовать обычный TImage
Вопрос - как его использовать, строка типа
Image1.Picture.Bitmap.Assign(IBQuery1.FieldByName("FOTO"))
Image1.Picture.Assign(IBQuery1.FieldByName("FOTO"));
Image1.Picture.Graphic.Assign(IBQuery1.FieldByName("FOTO"));

Выдают ту же самую ошибку: Bitmap image is not valid


 
Danilka ©   (2003-11-19 16:15) [10]

[9] Fants (19.11.03 16:04)
при работе с блобом используй stream


 
Fants   (2003-11-19 16:22) [11]

А пример ?


 
sniknik ©   (2003-11-19 16:26) [12]

Fants (19.11.03 16:04) [9]
> Image1.Picture.Graphic.Assign(IBQuery1.FieldByName("FOTO"));
вот так приблизительно, должно работать (делал чуть по другому, из access и через стрим)
только убедись что у тебя с Picture ассоциировано TJpgImage (просто для проверки другой Jpg вкачай в десигн тайме)


 
Danilka ©   (2003-11-19 16:42) [13]

[11] Fants (19.11.03 16:22)
только орокол, под ИБ не делал, но можно по-аналогии переделать:

var
Stream : TStream;
getFotoQuery : TQuery;
Blob : TBlobField;
jp:TJPEGImage;
begin
...
Blob := getFotoQuery.FieldByName("PICTURE") as TBlobField;
Blob.BlobType := ftOraBlob;
Stream := TBlobStream.Create(Blob, bmRead);
...
jp.LoadFromStream(Stream);
Image.Picture.Bitmap.assign(jp);
...

[12] sniknik © (19.11.03 16:26)
а разве без стрима будет работать?


 
Johnmen ©   (2003-11-19 16:42) [14]

Kак pаботать с blob сpeдствами FIBPlus?
=======================================
Пpиводим пpимepы pаботы с blob-полями. pFIBDatase1BLOBFIELD - полe типа BLOB датасeта pFIBDatabase1
Чтение из блоб-поля в OleContainer

var S: TStream;
begin
if not pFIBDataset1BLOBFIELD.IsNull then
begin
S:=pFIBDataset1.CreateBlobStream(pFIBDataset1BLOBFIELD, bmRead);
try
OleContainer1.LoadFromStream(S)
finally
S.Free
end;
end;
end;

Запись в блоб-полe из OleContainer (вызываeтся в BeforePost)

var S: TStream;
begin
S:=pFIBDataSet1.CreateBlobStream(pFIBDataSet1BLOBFIELD,
bmReadWrite);
try
OleContainer1.SaveToStream(S)
finally
S.Free
end;
end;


 
sniknik ©   (2003-11-19 19:03) [15]

Danilka © (19.11.03 16:42) [13]
> [12] sniknik © (19.11.03 16:26)
> а разве без стрима будет работать?
а хрен его знает, я не пробовал, но какая разница откуда данные закачивать, при условии что в Assign это реализовано. (я ж говорил приблизительно)


 
Kraks   (2003-11-19 22:50) [16]

Вот что мне посоветовали по такой же проблеме на форуме SQL.ru:
Использовать не TDBImage, а TImage

procedure TForm1.SpeedButton1Click(Sender: TObject);
var fEdit:boolean;
begin //загрузка из файла
if OpenPictureDialog.Execute then begin
if Table.State=dsBrowse then begin Table.Edit; fEdit:=true; end
else fEdit:=false;
Image.Picture.LoadFromFile(OpenPictureDialog.FileName);
if fEdit then Table.Post;
end;
end;

procedure TForm1.TableBeforePost(DataSet: TDataSet);
var BLOB:TBlobStream;
begin //сохранение картинки в базе
BLOB:=TBlobStream.Create(TableImage,bmWrite);
try
Image.Picture.Graphic.SaveToStream(BLOB);
finally BLOB.Free; end;
end;

procedure TForm1.DataSourceDataChange(Sender: TObject; Field: TField);
var BLOB:TBlobStream;
Code:word;
begin //считывание картинки из базы
if DataSource.State=dsBrowse then begin
BLOB:=TBlobStream.Create(TableImage,bmRead);
try
BLOB.Read(Code,SizeOf(Code)); BLOB.Seek(0,0);
case Code of
$4D42: begin
Image.Picture.Graphic:=TBitmap.Create;
Image.Picture.Graphic.LoadFromStream(BLOB);
end;
$D8FF: begin
Image.Picture.Graphic:=TJPEGImage.Create;
Image.Picture.Graphic.LoadFromStream(BLOB);
end;
end;
finally BLOB.Free; end;
end;
end;

Перед загрузкой изображения считываем первые два байта и определяем тип картинки, после чего откатываем поток к началу (Seek). Со стандартным TDBImage работать не будет!!

Кроме того, если есть желание и с GIF-ом работать, то можно использовать кроме стандартного модуля JPEG модуль RxGIF, входящий в состав Rx-компонентов, в котором описан класс TGIFImage. Тогда для идентификации GIF-а используйте такие два байта: $4947

А у меня вот какой вопрос: а как корректно очистить TImage? Ведь у Graphic нет Canvas. А в описанном случае кроме TBitmap используются TJPEGImage и TGIFImage. Я пробовал Image.Picture.Graphic := nil, но на том же форуме мне сказали, что будет утечка памяти... Может кто подскажет, как сделать-то? Или придётся опять же смотреть формат, заходить в нужный класс и очищать Canvas?


 
Kraks   (2003-11-20 08:11) [17]

Выяснил по поводу очистки TImage:

if Assigned(Image.Picture.Graphic) then
begin
Image.Picture.Graphic.Free;
Image.Picture.Graphic := nil;
end;


 
Kraks   (2003-11-21 08:03) [18]

Ой, нет. Так не работает... Использую:

if Assigned(Image.Picture.Graphic) then
Image.Picture.Graphic := nil;


 
Johnmen ©   (2003-11-21 09:16) [19]

>Kraks

Затыкай - нанюхались.
:))))))))))))))))))))



Страницы: 1 вся ветка

Текущий архив: 2003.12.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
6-36788
Yurko
2003-10-13 10:56
2003.12.12
Список открытых ресурсов.


1-36628
man
2003-12-01 10:53
2003.12.12
установка real


1-36753
closer
2003-11-28 20:42
2003.12.12
Использование try finally и try except


1-36723
Alexadna
2003-12-02 13:02
2003.12.12
Позиция курсора в строке


4-36910
plyaznik
2003-10-19 13:40
2003.12.12
как узнать есть ли галочка в checkbox?