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을 사용할려고 하구요!

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



    항상 감사드립니다.









    • 한승현
    • 1999.04.23 23:31
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.04.24 04:34
      한승현 wrote: > > dpk, dpl이 아닌 개별적인 파일(pas)을 가지고 하나씩 > component를 install시키...
    • 공대규
    • 1999.04.23 22:45
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.04.23 23:23
      공대규 wrote: > 안녕하십니까요? > > PaintBox에 Image1.canvas를 카피하려 할 때, 에러가 납니다. >...
    • 이민병
    • 1999.04.23 19:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김경수
      1999.04.24 05:06
      안녕하세요 김경수라는 사람입니다. 전 nt용 오라클8하구 델파이4랑 해봤는데 뭐 같은내용이겠지요.. 오...
    • 이상준
    • 1999.04.23 18:51
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.04.23 21:07
      이상준 wrote: > 윈도95의 바탕화면에 있는 네트워크 환경처럼 LAN으로 연결된 컴퓨터들의 > 컴퓨터 이름...
    • 배리스
    • 1999.04.23 06:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.04.23 07:08
      파워러브 델파이 창간호의 일부 입니다~ 1. 현재 라인번호 알아내기 메모에서 현재 Caret이 위치하...
    • 문창완
    • 1999.04.23 05:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.04.23 07:03
      참.. 혹시 검색엔진이 야후같은것을 말씀하신것이라면 기본개념은 이렇습니다. 별것 아니죠. 데이타 베...
    • 이정욱
      1999.04.23 07:01
      그냥 참고만 하세요~ http://www.nobreak.com 에 가시면 CrazySearch라는것이 있습니다. 그것의 소스를 ...
    • 이정욱
      1999.04.23 06:58
      저도 다오때문에 고생을 한적이 있었지요... 다오를 분명 설치를 했는데도 잘 안되더군요... 사실 저도 ...
    • 이현아
    • 1999.04.23 03:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.04.23 18:04
      이현아 wrote: > 안녕하세요! > 저는 이제 막 델파이 공부를 하는 직장인입니다. > 다름이 아니구요! >...
    • 이현아
      1999.04.24 16:43
      김영대 wrote: > 이현아 wrote: > > 안녕하세요! > > 저는 이제 막 델파이 공부를 하는 직장인입니다. ...
    • 조봉성
    • 1999.04.23 02:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.04.23 03:14
      조봉성 wrote: > table1.FieldByName('Pay').AsInteger := Result / 30 * 1000; > Result 는 정수형임 >...
    • 이정욱
      1999.04.23 02:45
      You need the following files to install DAO 3.5: Table 1 File name Location DAO350.DLL C:Program...
    • 임윤경
    • 1999.04.23 00:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.04.23 18:23
      임윤경 wrote: > 제가 김영대씨 홈페이지에서 받은 FTP서버의 파일을 PC로 다운로드하는 소스에 보면, rec...
    • 강지영
    • 1999.04.23 00:51
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 배리스
      1999.04.23 17:51
      안녕하세요. 강지영씨.. 오늘은 날씨가 별로 좋지 않네요. 하지만 이런 날씨가 더 좋은것 같습니다. 왜냐...
    • 김형하
    • 1999.04.22 20:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.04.23 07:10
      네.. 저희도 통신 프로그램의 터미널을 만들때 부딪혔던 문제입니다. 프린터같은 경우면 간단하게 LineTo...
    • 권용만
    • 1999.04.22 19:12
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.04.22 19:50
      권용만 wrote: > 항상 도움을 주셔서 감사합니다. > RunTime시에 Table 또는 Query에 필드를 넣으려 합니...
    • 권용만
      1999.04.22 22:56
      신인재 wrote: > 권용만 wrote: > > 항상 도움을 주셔서 감사합니다. > > RunTime시에 Table 또는 Query...
    • 신인재
      1999.04.23 00:43
      권용만 wrote: > 신인재 wrote: > > 권용만 wrote: > > > 항상 도움을 주셔서 감사합니다. > > > RunTi...
    • 신호철
    • 1999.04.22 19:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.04.22 20:18
      신호철 wrote: > 매일생성되는 화일에서 정리에서 리포트로 뽑으려 하는데 > 잘 정리가 않되서요 그리고...
    • 송동일
    • 1999.04.22 19:02
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.04.22 19:20
      송동일 wrote: > 스트링 중간에 콤마가 있는 것을 float로 바꾸려면 어떻게 해야 되는지 > 궁금합니다. ...
    • 송동일
      1999.04.22 19:36
      안치봉 wrote: > 송동일 wrote: > > 스트링 중간에 콤마가 있는 것을 float로 바꾸려면 어떻게 해야 되는...
    • 글쎄요.
      1999.04.22 23:29
      송동일 wrote: > 안치봉 wrote: > > 송동일 wrote: > > > 스트링 중간에 콤마가 있는 것을 float로 바꾸...
    • 안치봉
      1999.04.22 19:51
      송동일 wrote: > 안치봉 wrote: > > 송동일 wrote: > > > 스트링 중간에 콤마가 있는 것을 float로 바꾸...