![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BLOB, Jpeg, FireBird, FIBPLus [D5, IB6.x]
Fants © (2003-11-19 14:52:00)
Всем привет ! Вопрос такой: Есть таблица с полем BLOB для хранения фото. Через IBExpert сохранил в этом поле картинку формата Jpg. В программе через TpFIBDataSet задаю SelectSQL со всеми полями из этой таблицы, а когда создаю объекты-поля через Fields Editor вылетает ошибка о том что "Bitmap image is not valid", Возникает вопрос, как же работать с файлами формата jpg в базе данных.
Johnmen (2003-11-21 09:16:00) [1]
>Kraks
Затыкай - нанюхались.
:))))))))))))))))))))
Kraks (2003-11-21 08:03:00) [2]
Ой, нет. Так не работает... Использую:
if Assigned(Image.Picture.Graphic) then
Image.Picture.Graphic := nil;
Kraks (2003-11-20 08:11:00) [3]
Выяснил по поводу очистки TImage:
if Assigned(Image.Picture.Graphic) then
begin
Image.Picture.Graphic.Free;
Image.Picture.Graphic := nil;
end;
Kraks (2003-11-19 22:50:00) [4]
Вот что мне посоветовали по такой же проблеме на форуме 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?
sniknik (2003-11-19 19:03:00) [5]
Danilka © (19.11.03 16:42) [13]
> [12] sniknik © (19.11.03 16:26)
> а разве без стрима будет работать?
а хрен его знает, я не пробовал, но какая разница откуда данные закачивать, при условии что в Assign это реализовано. (я ж говорил приблизительно)
Johnmen (2003-11-19 16:42:00) [6]
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;
Danilka (2003-11-19 16:42:00) [7]
[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)
а разве без стрима будет работать?
sniknik (2003-11-19 16:26:00) [8]
Fants (19.11.03 16:04) [9]
> Image1.Picture.Graphic.Assign(IBQuery1.FieldByName("FOTO"));
вот так приблизительно, должно работать (делал чуть по другому, из access и через стрим)
только убедись что у тебя с Picture ассоциировано TJpgImage (просто для проверки другой Jpg вкачай в десигн тайме)
Fants (2003-11-19 16:22:00) [9]
А пример ?
Danilka (2003-11-19 16:15:00) [10]
[9] Fants (19.11.03 16:04)
при работе с блобом используй stream
Fants (2003-11-19 16:04:00) [11]
>Отсюда вывод - использовать обычный 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
Romkin (2003-11-19 15:57:00) [12]
А вот это вопрос :) uses JPeg в interface секции не помогает?
Скорее всего нет. Отсюда вывод - использовать обычный TImage
Fants (2003-11-19 15:48:00) [13]
А как мне фото посмотреть то :))))
Johnmen (2003-11-19 15:45:00) [14]
Убери DBImage, и ошибка исчезнет :)
Fants (2003-11-19 15:40:00) [15]
В контестном меню Fields Editor указываю Add All Fields, при этом есть DBImage связанный с DataSource FIBDataSet, ошибка вылетает также при открытии набора данных
Johnmen (2003-11-19 15:33:00) [16]
Ошибка из-за того, что иытаешься, явно или нет, "посмотреть" на BLOB поле, как на bmp.
Что указываешь при "создаю объекты-поля через Fields Editor вылетает ошибка о том что "Bitmap image is not valid",... " ?
Fants (2003-11-19 15:29:00) [17]
Ответ понятен. Но где решение проблемы , что делать ? Что за ошибка.
Johnmen (2003-11-19 15:24:00) [18]
В БД нет никаких файлов, никаких форматов файлов. А есть BLOB поля, в которых может храниться всё, что угодно. Хоть bmp, хоть jpg, хоть exe, хоть "Война и мир"...
Fants (2003-11-19 15:23:00) [19]
Ребятки, очень нужно ПОМОГИТЕ