Q&A

  • [re] 제가 해본 건 아니구.. 아래와 같이 하면 된데요..
누군가 대답 할 지 알았는데, 아직도 없군요..

제가 해본 건 아니구.. 아래와 같이 하면 된데요..

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

1  COMMENTS
  • Profile
    지이레크 2009.02.13 19:43
    타락 천사 님..

    감사 글을 써 주셔서 감사 합니다.

    그런데 써주진 방법은 파일을 자신의 PC 에 저장 해서 불러 오고 하는 방법이 아닌가요??

    보안 and 유지 보수상. 이미지를 PC 에 저장이 불가능한 사항입니다.

    (삭제 하는 방법도 있지만 그건 일단 미루고 있는 상황입니다. )

    DB 에만 붙어야 하는 상황이죠..

    그래도 나중에

    파일을 불러와서 PC 에 저장 하는 쪽으로 바뀌게 돼면 매우 유요 하겠습니다

    소중한 코드를 공유해 주셔서 감사 합니다.
    • 타락천사
      2009.02.12 21:24
      그렇군요.. 저도 다른 API와 뭐가 다를까 궁금하군요.. 컨버젼 하기 구찮아서 C++ Builder 로 해봐야 겠...
    • 최용일
      2009.02.12 22:22
      오래전부터 Project JEDI에서 컨버팅을 해오고 있었던 내용들이군요... http://jedi-apilib.sourcefor...
    • 송 시중
      2009.02.12 22:26
      와.. 좋은 사이트를 알았네요. 감사합니다.
    • 김동원
      2009.02.17 17:48
      CreateProcess의 원형은 다음과 같습니다. BOOL CreateProcess( LPCTSTR lpApplicationName, LP...
    • Elpira
    • 2009.02.12 08:48
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2009.02.11 00:58
      아주 옛날에 테스트용으로 ActiveX 로 바꿔봤던 기억이 있네요. http://www.delmadang.com/ 델마당의...
    • Marek
      2009.02.11 22:24
      예 님의 생각이 맞습니다만 ActiveX프로젝트를 일단 생성하면 Propert와 Event가 상당부분 없어지기 때...
    • 한경수
    • 2009.02.10 21:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Marek
      2009.02.11 22:21
      서버측의 방화벽에서 11433port가 Any to Any로 되어 있는지 확인해 보시는 것이 좋을것 같습니다. BDE...
    • JM
    • 2009.02.10 14:21
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.10 18:55
      탭 위치에 탭 갯수만큼 TImage 를 놓고 탭을 대신하는 방법이 깔끔 할 겁니다..
    • 소울해커
      2009.02.10 20:08
      TabControl의 마우스 다운 이벤트에서 if PtInRect(Rect(R.Left + 160, R.Top + 8, R.Left + 160 + Im...
    • JM
      2009.02.10 20:14
      답변감사합니다 ^^
    • 고명수
    • 2009.02.10 08:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2009.02.10 20:09
      TransprentColor 속성이 있을텐데 그걸 Color 값과 맞춰 보세요.
    • 조성환
    • 2009.02.10 02:47
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.10 18:53
      아마 DLL 에 있는 델파이 폼에서 문제가 발생하는 것으로 보입니다. 델파이 폼에는 전역적으로 TAppli...
    • 조성환
      2009.02.10 22:25
      감사합니다. 해결방법을 검색해보도록 하겠습니다.
    • 박종철
      2009.02.10 00:14
      자답입니다. Aplication.MessageBox('중복된 파일을 덮어쓰시겠습니까?', '다른 이름으로 저장', MB_Y...
    • 소울해커
      2009.02.09 21:07
      TMS 그리드고 번호가 단순히 1부터 RowCount까지만 들어간다면 ContextGrid->AutoNumberCol(0); ...
    • 박진수
      2009.02.09 22:36
      우왓!!! 너무 잘됩니다!!!! ㅜ.ㅜ 소울해커님 너무 고맙습니다!!! 사랑해요! 뽀뽀라도 해드리고 싶...
    • 타락천사
      2009.02.09 23:46
      TMemoField 에서 TStringList 에 받아서 스트링그리드의 셀에 넣으면 될 겁니다. VAR aBlobS...
    • 전봉수
      2009.02.12 01:45
      타락1004님 답변 갑사합나다. 설명하신 대로 해보려하니 어떻게 소스코드를 만들어야할지 황당 합니다. ...
    • 소울해커
      2009.02.17 03:46
      TMemoField 부분을 쿼리에서 불러온 메모필드로 넣으시고 MyList에 값이 들어가고 나면 StringGrid...
    • 21세기
    • 2009.02.09 07:39
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2009.02.09 19:17
      원하는것이 무엇인지요???? 파일을 복사하려는것이 목적인지... 등록정보에 뭔가 표시할려고 하는것이...
    • 21세기
      2009.02.09 23:02
      파일의 전체 사이즈는 같게하고, 파일의 특정한 일부분만 복사하고 싶습니다.
    • 타락천사
      2009.02.09 23:18
      1. 크기 100 MB TFileStream.Size := 100 MB 2. 일부분 복사 TFileStream.Posistion := 0; 한 ...
    • 21세기
      2009.02.10 06:54
      먼저, 답변 감사드립니다. var FS: TFileStream; Buf: array[0..1024] of char; begin FS...
    • 타락천사
      2009.02.10 18:49
      질문 : FS.Write(Buf, SizeOf(Buf)); <--- 이부분에서 속도가 느려지는군요. 빠르게 할 수 없을까요...
    • 이정욱
      2009.02.12 13:19
      빠르게 할수 있습니다. 버퍼 사이즈를 늘리세요. 1k는 너무 작네요.
    • 타락천사
      2009.02.13 00:23
      헉.. 한 질문에 여러 다른 해석이 있군요..
    • 최용일
      2009.02.09 19:23
      눈으로 봐도 utf8인지 알 수 없어요... 디코딩할 필요가 없다는 것을 알아서 안하는것이 아니라 디폴트...
    • 조일현
    • 2009.02.08 00:12
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.09 23:14
      try if frmMain.ComPort1.Connected then <<<<< 이부분에서 위의 오...
    • 조일현
      2009.02.10 00:11
      ㅠㅜ 타락님께서 가르쳐 주신 방법으로 해보았으나 되지 않습니다... 위의 그림 파일과 같은 에러창이 a...
    • 타락천사
      2009.02.10 00:35
      CPort 3.1 은 사용해 본적이 있습니다. 안정적인 버젼이었던 걸로 기억 합니다. 아마도, // if fr...
    • 조일현
      2009.02.10 02:52
      네 frmMain 에 nil이 들어있네요 그럼 이걸 어떻게 해야 하나요?? 써주지 말아야 되나요?
    • 박무개
    • 2009.02.07 02:24
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 와이군
      2009.02.07 10:34
      function Format(const Format: string; const Args: array of const): string; Format 함수의 Args인...
    • 박무개
      2009.02.09 17:12
      덕분에 해결 하였읍니다. 답변 감사합니다. 즐거운 하루 되세요.
    • 윤병길
    • 2009.02.07 01:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.09 23:10
      쩝.. 스크린의 가로세로 인치당 도트수가 같은 경우 값 얻기. PixelPerInchY := Screen.PiexelsPerIn...
    • Marek
      2009.02.09 23:16
      참고하십시요. Bitmap의 경우에는 가로세로의 크기만 있기때문에 아래코드의 Dpi는 의미가 없습니다. ...
    • 후초보
    • 2009.02.06 22:42
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2009.02.07 01:01
      Selected는 노드가 선택되어 있는지 아닌지를 알려주는 값입니다. True일 때 선택되어져 있음. 선택을 ...
    • 후초보
      2009.02.07 03:56
      감사합니다. 가르켜 주신대로 해 보았는데 선택된것을 확인해 보니 선택은 되어있는데 마우스로 선택한 ...
    • 최용일
      2009.02.07 04:48
      treeComp.AddToSelection(Node); 스크롤은 WM_VSCROLL로 검색해보세요.
    • 후초보
      2009.02.07 23:56
      감사합니다. 그런데.. AddToSelection 메소드(?)가 없습니다. 컴퍼일하니 treeComp.AddToSelection ...
    • 최용일
      2009.02.09 19:15
      아 protected였네요... Selected를 이용하면 쉽게 할 수 있네요... 좀 어렵게 생각했었군요... 이거 다...
    • 후초보
      2009.02.09 23:42
      감사합니다. 덕분에 해결책이 보이기 시작합니다. 이제 Scroll 을 해결 해야겠습니다. 고맙습니다.
    • 지이레크
      2009.02.13 19:43
      타락 천사 님.. 감사 글을 써 주셔서 감사 합니다. 그런데 써주진 방법은 파일을 자신의 PC 에 저...