سلام.
دو تا پردازه برات میگذارم که خودم با اونا کار می کنم:
procedure LoadPictureFromField(ADOContainer: TCustomADODataSet; BlobField: TBlobField; Img: TImage);
var
Stream:TStream;
JPG: TJPEGImage;
JPG_Error: boolean;
begin
Stream := TStream.Create;
JPG := TJPEGImage.Create;
Stream := ADOContainer.CreateBlobStream(BlobField,bmRead);
if Stream.Size = 0 then
begin
Img.Picture.Assign(nil);
exit;
end;
JPG_Error := false;
try
JPG.LoadFromStream(Stream);
except
JPG_Error := true;
end;
if not JPG_Error then
begin
Stream.Destroy;
Img.Picture.Assign(JPG);
JPG.Destroy;
end
else
begin
Stream.Destroy;
JPG.Destroy;
Img.Picture.Assign(BlobField); // when old type exists in DB started by 0x424D
end;
end;
procedure SavePictureToField(ADOContainer: TADOStoredProc; Parameter: string; Img: TImage);
var
JPG : TJPEGImage;
MemoryStream : TMemoryStream;
begin
if Img.Picture.Graphic <> nil then
begin
// SetPictureMinimalToSave(Img, 100);
JPG := TJPEGImage.Create;
MemoryStream := TMemoryStream.Create;
JPG.Assign(Img.Picture.Graphic);
JPG.SaveToStream(MemoryStream);
ADOContainer.Parameters.paramByName(Parameter).Loa dFromStream(MemoryStream,ftVarBytes);
MemoryStream.Destroy;
JPG.Destroy;
end
else
ADOContainer.Parameters.paramByName(Parameter).Val ue := null;
end;
نحوه فراخوانی ساده ای هم دارند.
برای ذخیره:
SavePictureToField(SP, '@Field', Image);
برای بازیابی:
LoadPictureFromField(SP, SPField, Image);
این هم برای کم حجم کردن عکس قبل از ذخیره:
procedure SetPictureMinimalToSave(IMG: TImage; Quality: TJPEGQualityRange = 100);
var
JPG: TJPEGImage; {U30: decrease size of picture fit to Image and JPG}
BMP: TBitmap;
begin
BMP := TBitmap.Create;
JPG := TJPEGImage.Create;
BMP.Assign(IMG.Picture.Graphic);
IMG.Picture.Assign(BMP);
BMP.Width := IMG.Width;
BMP.Height := IMG.Height;
BMP.Canvas.StretchDraw(BMP.Canvas.ClipRect,IMG.Pic ture.Graphic);
JPG.Assign(BMP);
JPG.CompressionQuality := Quality;
JPG.Compress;
IMG.Picture.Assign(JPG);
BMP.Destroy;
JPG.Destroy;
end;