누군가 대답 할 지 알았는데, 아직도 없군요..
제가 해본 건 아니구.. 아래와 같이 하면 된데요..
[DB팁] JPEG, JPG, BMP 를 DB에 저장하고 불러오기
출처 : 통합델파이 QnA
[1] JPEG(JPG), BMP 를 DB에 저장하고 불러오기
unit DbJpeg;
interface
uses
Db, ExtCtrls, Classes, Graphics, Jpeg, SysUtils;
implementation
procedure JPEGSaveToDB(BlobField: TBlobField; FileName: String);
var
jpg: TJPEGImage;
bmp: TBitmap;
mem: TMemoryStream;
begin
if LowerCase(ExtractFileExt(FileName)) = '.jpg' then
begin
with BlobField do
begin
// 아래 DataSet.Edit; 는 저장된 그림을 수정(UPDATE)시 사용하며
// 신규 등록(INSERT)일때는 DataSet.Insert; 로 바꾸어야 한다
DataSet.Edit;
LoadFromFile(FileName);
DataSet.Post;
end;
end
else if LowerCase(ExtractFileExt(FileName)) = '.bmp' then
begin
// 파일이 BMP 이면 먼저 JPEG(JPG) 파일로 바꾼 후 저장한다
bmp := TBitmap.Create;
jpg := TJPEGImage.Create;
mem := TMemoryStream.Create;
try
bmp.LoadFromFile(FileName);
jpg.Assign(bmp);
jpg.SaveToStream(mem);
mem.Position := 0;
with BlobField do begin
DataSet.Edit;
LoadFromStream(mem);
DataSet.Post;
end;
finally
mem.Free;
jpg.Free;
bmp.Free;
end;
end
end;
procedure JPEGLoadFromDB(BlobField: TBlobField; Image: TImage);
var
jpg: TJPEGImage;
mem: TMemoryStream;
begin
jpg := TJPEGImage.Create;
mem := TMemoryStream.Create;
try
if BlobField.IsNull then
Image.Picture := nil
else begin
BlobField.SaveToStream(mem);
mem.Position := 0;
jpg.LoadFromStream(mem);
Image.Picture.Graphic := jpg;
end;
finally
mem.Free;
jpg.Free;
end;
end;
end.
[2] DB에 저장된 JPEG(JPG)를 DBGrid에 출력하기
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, Grids, jpeg, extctrls, DBGrids;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
Query1: TQuery;
Database1: TDatabase;
DBGridEH1: TDBGridEH;
procedure DBGridEH1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumnEH; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure JPEGLoadFromDB(BlobField: TBlobField; Image: TImage);
var
jpg: TJPEGImage;
mem: TMemoryStream;
begin
jpg := TJPEGImage.Create;
mem := TMemoryStream.Create;
try
if BlobField.IsNull then
Image.Picture := nil
else begin
BlobField.SaveToStream(mem);
mem.Position := 0;
jpg.LoadFromStream(mem);
Image.Picture.Graphic := jpg;
end;
finally
mem.Free;
jpg.Free;
end;
end;
procedure TForm1.DBGridEH1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEH;
State: TGridDrawState);
var
JPGimage: TImage;
SRect, DRect: TRect;
begin
if Column.FieldName= 'PHOTO' then
begin
JPGimage := TImage.Create(Self);
JPEGLoadFromDB(TBlobField(Query1.FieldByName('PHOTO')), JPGimage);
TDBGrid(Sender).Canvas.FillRect(Rect);
TDBGrid(Sender).Canvas.Draw(Rect.Left, Rect.Top, JPGimage.Picture.Graphic);
// Stretch 는 아래와 같이...
// TDBGrid(Sender).Canvas.StretchDraw(Rect, JPGimage.Picture.Graphic);
JPGimage.Free;
end
else // 다른 필드
begin
TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
end.
감사 글을 써 주셔서 감사 합니다.
그런데 써주진 방법은 파일을 자신의 PC 에 저장 해서 불러 오고 하는 방법이 아닌가요??
보안 and 유지 보수상. 이미지를 PC 에 저장이 불가능한 사항입니다.
(삭제 하는 방법도 있지만 그건 일단 미루고 있는 상황입니다. )
DB 에만 붙어야 하는 상황이죠..
그래도 나중에
파일을 불러와서 PC 에 저장 하는 쪽으로 바뀌게 돼면 매우 유요 하겠습니다
소중한 코드를 공유해 주셔서 감사 합니다.