Чтение графического рисунка любого формата из базы данных в BLOB-поле
1-ый вариант - в компонент TDBImage (его надо наследовать)
Код:
uses ......, JPEG, GIFImage;
..........................................
TDBImageEx = class(TDBImage)
private
procedure ExDataChange(Sender: TObject);
procedure SetAdiImageType(const Value: TAdiImageType);
function Get_FDataLink: TFieldDataLink;
function LoadPictureFromDB(AField:TField; APicture: TPicture):boolean;
protected
property _FDataLink : TFieldDataLink read Get_FDataLink;
procedure ExLoadPicture;
public
constructor Create(AOwner : TComponent); override;
..........................................
{ TDBImageEx }
function TDBImageEx.LoadPictureFromDB(AField: TField; APicture: TPicture): boolean;
var
fldBLOB : TBlobField;
MemStream : TMemoryStream;
ImgGraphic : TGraphic;
arFormat : array[1..3] of char;
begin
Result := false;
if (AField is TBlobField) and Assigned(APicture) then
begin
fldBLOB := TBlobField(AField);
if not (fldBLOB.IsNull) then
begin
MemStream := TMemoryStream.Create();
try
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
fldBLOB.SaveToStream(MemStream);
MemStream.Position := 0;
if (MemStream.Size > 3) then
begin
MemStream.Read(arFormat, 3);
//Bitmap
if (arFormat[1]='B') and (arFormat[2]='M') then
ImgGraphic := Graphics.TBitmap.Create() //Файл Graphics.pas
else
//GIF
if (arFormat[1]='G') and (arFormat[2]='I') and (arFormat[3]='F') then
ImgGraphic := GIFImage.TGIFImage.Create() //Файл GIFImage.pas
else
//JPEG
if (arFormat[1]=#$FF) and (arFormat[2]=#$D8) and (arFormat[3]=#$FF) then
ImgGraphic := JPEG.TJPEGImage.Create() //Файл JPEG.pas
else
//EXIF
if (arFormat[1]='E') and (arFormat[2]='X') and (arFormat[3]='I') then
ImgGraphic := JPEG.TJPEGImage.Create() //Файл JPEG.pas
else
//WMF - метафайл #$D7#$CD#$C6#$9A
if (arFormat[1]=#$D7) and (arFormat[2]=#$CD) and (arFormat[3]=#$C6) then
ImgGraphic := Graphics.TMetafile.Create() //Файл Graphics.pas
else //Default
ImgGraphic := Graphics.TBitmap.Create(); //Файл Graphics.pas
if Assigned(ImgGraphic) then
begin
MemStream.Position := 0;
ImgGraphic.LoadFromStream(MemStream);
APicture.Assign(ImgGraphic);
ImgGraphic.Free;
Result := true;
end;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
finally
MemStream.Free;
end;
end;
end;
if not Result then
APicture.Assign(nil);
end;
procedure TDBImageEx.ExDataChange(Sender: TObject);
begin
Picture.Graphic := nil;
if AutoDisplay then
ExLoadPicture;
end;
procedure TDBImageEx.ExLoadPicture;
begin
if (not Assigned(_FDataLink.Field) or _FDataLink.Field.IsBlob) then
LoadPictureFromDB(_FDataLink.Field, Picture);
end;
constructor TDBImageEx.Create(AOwner: TComponent);
begin
inherited Create( AOwner );
_FDataLink.OnDataChange := ExDataChange;
end;
function TDBImageEx.Get_FDataLink: TFieldDataLink;
begin
Result := TFieldDataLink(Perform(CM_GETDATALINK, 0, 0));
end;