Q&A

  • Query로 불러온 Image 필드를 TImage 컴퍼넌트로 보여주기

MS-SQL 서버에서 TQuery를 이용해 불러온 Image Field를 TImage 컴퍼넌트 보여주려 하는데

잘 안되네요... 모가 빠졌나요? 아님 다른 방법이라도 알려주세여~

아래의 두가지 방법으로 시도해봤는데 모두

에러가 발생하네요

'JPEG error #53'


물론 uses 절에 jpeg 추가했습니다.

**방법1**************************************************************

procedure TFrmbEmpImageEntry.Query;
var
jpg_face : TJPEGImage;
jpgStream : TStream;

begin
  try
    MsgDisplay(msg_query_on, 0);
  //기본 정보
    QueryEmpInfo.Close;
    QueryEmpInfo.ParamByName('EmpID1').AsString := Copy(EditEmpID.Text, 1, 1);
    QueryEmpInfo.ParamByName('EmpID2').AsString := Copy(EditEmpID.Text, 2, 2);
    QueryEmpInfo.ParamByName('EmpID3').AsString := Copy(EditEmpID.Text, 4, 3);
    QueryEmpInfo.Open;

    jpg_face := TJPEGImage.Create;
    jpgStream := TStream.Create;

    jpgStream := QueryEmpInfo.CreateBlobStream(QueryEmpInfo.FieldByName('photo'), bmRead);
    try
      jpg_face.LoadFromStream(jpgStream);
      ImageEmpFace.Picture.Assign(jpg_face);
    finally
      jpg_face.Free;
      jpgStream.Free;
    end;

    MsgDisplay(msg_query_succ_fmt, [QueryEmpInfo.RecordCount], 5);
  except
  on  E: Exception do
    begin
    MsgClear;
    MsgBox(msg_query_fail, E.Message, MB_OK+MB_ICONHAND+MB_APPLMODAL);
    end;
  end;
end;


**방법2*********************************************************************


procedure TFrmbEmpImageEntry.Query;
var
jpg_face : TJPEGImage;
jpgStream : TStream;
Buffer : PChar;                //그림이 저장될 메모리를 가진 포인터
MemSize : Integer;        //그림이 저장될 메모리 크기

begin
  try
    MsgDisplay(msg_query_on, 0);
  //기본 정보
    QueryEmpInfo.Close;
    QueryEmpInfo.ParamByName('EmpID1').AsString := Copy(EditEmpID.Text, 1, 1);
    QueryEmpInfo.ParamByName('EmpID2').AsString := Copy(EditEmpID.Text, 2, 2);
    QueryEmpInfo.ParamByName('EmpID3').AsString := Copy(EditEmpID.Text, 4, 3);
    QueryEmpInfo.Open;

    jpg_face := TJPEGImage.Create;
    jpgStream := TStream.Create;

    jpgStream := QueryEmpInfo.CreateBlobStream(QueryEmpInfo.FieldByName('photo'), bmRead);
    //이미지를 읽기 위해 BLOBStream을 생성
    MemSize := jpgStream.Size;      //그림이 저장될 공간의 크기
    Inc(MemSize);                   //Null 값을 저장하기 위해 1 증가
    Buffer := AllocMem(MemSize);    //포인터에 메모리 할당

    try
      jpgStream.Read(Buffer^, MemSize);      //BLOBStream의 Buffer에서 MemoSize만큼 읽어 들인다.
      jpgStream.Position := 0;               //BLOBStream의 처음 위치로 이동
      jpg_face := TJPEGImage.Create;         //TJPEGImage 생성

      try
        jpg_face.LoadFromStream(jpgStream);        //TJPEGImage에 BLOBStream을 Load
        ImageEmpFace.Picture.Assign(jpg_face);     //TImage에 TJPEGImage 할당

      finally
        jpg_face.Free;                    //사용한 메모리 반환
        jpgStream.Free;
      end;
    finally

      FreeMem(Buffer, MemSize);           //사용한 메모리 반환
    end;

    MsgDisplay(msg_query_succ_fmt, [QueryEmpInfo.RecordCount], 5);

  except
  on  E: Exception do
    begin
    MsgClear;
    MsgBox(msg_query_fail, E.Message, MB_OK+MB_ICONHAND+MB_APPLMODAL);
    end;
  end;
end;

0  COMMENTS