![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение/запись в BLOB-поле IB файла JPEG. [D5, IB6.x]
Петр © (2004-06-02 08:45:00)Не могу считать из BLOB-поля IB в TImage записанный файл формата JPEG. Пробовал и TImage.Picture.Assign(<BLOB-поле>), и через поток TMemoryStream, используя SaveToStream и LoadFromStream, все равно выдает ошибку вроде "JPEG error #41", хотя с записью проблем нет. Сделал через временный файл посредством SaveToFile,LoadFromFile,
но это, согласитесь, не выход из положения. Подкиньте, пожалуйста, идейку. Буду благодарен.
Aladin (2004-06-03 12:53:00) [1]Попробуйте компонент
umDBImage
TATIANA (2004-06-03 11:56:00) [2]Пример далек от совершенства , надо обрабатывать исключительные ситуации . В начале модуля необходимо вставить <JPEG>
.....
interface
uses Windows, Graphics, Forms, ... , Jpeg;
.....
var Bm1:TMemoryStream;
Jp1:TBitmap;
Jp2:TJPEGImage;
notJpg:Boolean;
begin
notJpg := false;
Image1.Picture.Assign(nil);
notJpg := False;
Bm1:= TMemoryStream.Create;
IBQuery5PLAN_KV.SaveToStream(Bm1);
Bm1.Position := 0;
if Bm1.Size > 0 then begin
try
Jp1 := TBitmap.Create;
Jp1.LoadFromStream(Bm1);
Image1.Picture.Bitmap.Assign(Jp1); // .bmp
Except
on EInvalidGraphic do notJpg := true;
end;
Jp1.Free;
Bm1.Free;
if notJpg then begin
Bm1:= TMemoryStream.Create;
IBQuery5PLAN_KV.SaveToStream(Bm1);
Bm1.Position := 0;
Jp2 := TJPEGImage.Create;
Jp2.LoadFromStream(Bm1);
try
Image1.Picture.Bitmap.Assign(Jp2); // .ipg
finally
Bm1.Free;
Jp2.Free;
end;
end;
end
else
begin
Image1.Picture.Assign(nil);
Bm1.Free;
end; // bm1.size > 0
// ris - dom
end; // ibq5
// ris
notJpg := False;
Bm1:= TMemoryStream.Create;
case WPR of
0: Form3.IBQuery1PLAN_KV.SaveToStream(Bm1);
1: Form5.IBQuery1PLAN_KV.SaveToStream(Bm1);
end;
Bm1.Position := 0;
if Bm1.Size > 0 then begin
try
Jp1 := TBitmap.Create;
Jp1.LoadFromStream(Bm1);
Image2.Picture.Bitmap.Assign(Jp1);
Except
on EInvalidGraphic do notJpg := true;
end;
Jp1.Free;
Bm1.Free;
if notJpg then begin
Bm1:= TMemoryStream.Create;
case WPR of
0: Form3.IBQuery1PLAN_KV.SaveToStream(Bm1);
1: Form5.IBQuery1PLAN_KV.SaveToStream(Bm1);
end;
Bm1.Position := 0;
Jp2 := TJPEGImage.Create;
Jp2.LoadFromStream(Bm1);
try
Image2.Picture.Bitmap.Assign(Jp2);
finally
Bm1.Free;
Jp2.Free;
end;
end;
end
else
begin
Image2.Picture.Assign(nil);
Bm1.Free;
end; // bm1.size > 0
IBTransaction1.Active := false;
// ris
end; // izmg > 1
Romkin (2004-06-02 13:05:00) [3]Вот, разгребается с типом изображения:
function GetStreamImgType(Stream: TStream): TClass;
var
StreamPos: int64;
ImgSign: string;
begin
StreamPos := Stream.Position;
try
//BMP если не определено
Result := Graphics.TBitmap;
//JPEG
SetLength(ImgSign, 4);
Stream.Seek(6, soFromCurrent);
Stream.Read(ImgSign[1],4);
if (UpperCase(ImgSign) = 'JFIF') or (UpperCase(ImgSign) = 'EXIF') then
Result := Jpeg.TJPEGImage;
//WMF
Stream.Position := StreamPos;
SetLength(ImgSign, 4);
Stream.Read(ImgSign[1],4);
if ImgSign = #$D7#$CD#$C6#$9A then
Result := Graphics.TMetafile;
finally
Stream.Position := StreamPos;
end;
end;
procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
Img: TGraphic;
StreamPos: int64;
begin
StreamPos := Stream.Position;
Img := TGraphicClass(GetStreamImgType(Stream)).Create;
try
Stream.Position := StreamPos;
Img.LoadFromStream(Stream);
Picture.Graphic := Img;
finally
Img.Free;
end;
end;
function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
Stream: TStream;
begin
Result := False;
if not Field.isNULL then
begin
Stream := TMemoryStream.Create;
try
Field.SaveToStream(Stream);
Stream.Position := 0;
LoadProperImage(Stream, Picture);
Result := True;
finally
Stream.Free;
end;
end;
end;
procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
Stream: TStream;
begin
if not (Field.DataSet.State in [dsEdit, dsInsert]) then
Field.DataSet.Edit;
Field.Clear;
if Assigned(Picture.Graphic) then
if not Picture.Graphic.Empty then
begin
Stream := TMemoryStream.Create;
try
Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
Field.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
end;
1008 (2004-06-02 12:18:00) [4]Для чтения:
var
MyStream:TStream;
...
MyStream:=YouTable.CreateBlobStream(FieldByName('Picture'), bmRead);
...
{манипулируем потоком}
...
MyStream.Free;//лучше освободить ресурсы
Для записи:
var
MyStream:TMemoryStream;
...
MyStream:=TMemoryStream.Create;
with Data.Query do begin
Active:=false;
SQL.Clear;
SQL.Add('INSERT INTO YouTable (Pictures)');
SQL.Add('VALUES (:Pictures)');
Params[0].LoadFromStream(MyStream, ftBlob);
Open;
end;//with Data.Query do begin
MyStream.Free;//лучше освободить ресурсы
Если не ошибаюсь, то так.
Johnmen (2004-06-02 09:14:00) [5]>sniknik © (02.06.04 09:11) [3]
:)
sniknik (2004-06-02 09:11:00) [6]Johnmen © (02.06.04 09:06) [1]
ну ты захотел, прям сразу. ;о))
сначала в общем поорасуждаем, может быть на глюки борланда посетуем, ...(хз.), а вот после если дойдет необходимось... ;о))
sniknik (2004-06-02 09:07:00) [7]читать надо также как и пишеш - пишеш в базу с файла (неважно LoadFromFile или LoadFromStream если в стриме файл) значит и вынимать из базы нужно в файл, если с картинки то в картинку.
это основная идея.
почему это важно? думаю потому что в файле и в картинке на экране(компоненте) разное представление в файле лежит сжатый образ плюс там может быть палитра и д.р. гадость (если не путаю, про форматы давно читал еще во времена глобального доса), это не BMP который практически образ памяти. в общемто былобы неважным если бы метод TImage.Picture.Assign "умел" распознавать что ему пришло на вход в каком виде и преобразовывать если данные как из файла. "научите" его, или сам следи что где.
Johnmen (2004-06-02 09:06:00) [8]Код пробования чтения ?