Q&A

  • DB에 사진넣을려고 하는데..
안녕하세요!



저는 이제 막 델파이 공부를 하는 직장인입니다.



다름이 아니구요!



Edit박스로 성명이나 주민번호를 조회해서, DBIMAGE에 개개인의 사진을



출력하고자 합니다.



방법을 알려주시구요! 그리고 따로 사진이라는 필드(레코드)를 만들지 않았습니다.



저장방법도 묻고 싶네요.



아무쪼록 좋은 방법을 제시 해주시면 정말 감사드리겠습니다.

2  COMMENTS
  • Profile
    김영대 1999.04.23 18:04
    이현아 wrote:

    > 안녕하세요!

    > 저는 이제 막 델파이 공부를 하는 직장인입니다.

    > 다름이 아니구요!

    > Edit박스로 성명이나 주민번호를 조회해서, DBIMAGE에 개개인의 사진을

    > 출력하고자 합니다.

    > 방법을 알려주시구요! 그리고 따로 사진이라는 필드(레코드)를 만들지 않았습니다.

    > 저장방법도 묻고 싶네요.

    > 아무쪼록 좋은 방법을 제시 해주시면 정말 감사드리겠습니다.



    안녕하세요 김영대입니다

    만약 사용하시는 DBMS 가 ORACLE 이면 blob 필드의 data type을

    long raw 로 사용하시면 됩니다

    참고로 long 형은 2GB의 text 자료를 long raw 는 binary 자료를

    2GB 까지 저장할 수 있습니다

    다른 DB 들도 blob 필드를 만드는 해당 type이 따로 있을겁니다



    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.



    -------------------------------------------------------------------------

    // 아래는 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.



  • Profile
    이현아 1999.04.24 16:43
    김영대 wrote:

    > 이현아 wrote:

    > > 안녕하세요!

    > > 저는 이제 막 델파이 공부를 하는 직장인입니다.

    > > 다름이 아니구요!

    > > Edit박스로 성명이나 주민번호를 조회해서, DBIMAGE에 개개인의 사진을

    > > 출력하고자 합니다.

    > > 방법을 알려주시구요! 그리고 따로 사진이라는 필드(레코드)를 만들지 않았습니다.

    > > 저장방법도 묻고 싶네요.

    > > 아무쪼록 좋은 방법을 제시 해주시면 정말 감사드리겠습니다.

    >

    > 안녕하세요 김영대입니다

    > 만약 사용하시는 DBMS 가 ORACLE 이면 blob 필드의 data type을

    > long raw 로 사용하시면 됩니다

    > 참고로 long 형은 2GB의 text 자료를 long raw 는 binary 자료를

    > 2GB 까지 저장할 수 있습니다

    > 다른 DB 들도 blob 필드를 만드는 해당 type이 따로 있을겁니다

    >

    > 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.

    >

    > -------------------------------------------------------------------------

    > // 아래는 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.

    >



    답변 진심으로 감사드려요!

    그런데 전 DB를 InormixDB를 사용합니다.

    또한 저의 계획은 Local DB를 사용해(즉 informix DB)를

    C 디렉토리를 따로 만들어 사진을 사번에 맞게 넣고자 합니다.

    기법은 SQL을 사용할려고 하구요!

    바쁘시겠지만 한번만 더 부탁을 드릴께요!



    항상 감사드립니다.