본문 바로가기

Delphi/C++Builder

퀵레포트(Quick Report)에 사진 출력하기

DBMS의 Blob 컬럼의 이미지 데이터를 퀵레포트 보고서에 출력하는 내용입니다.


(추가)

 2016.09.02 : 미리보기에서 사진이 나오는데, 실제 인쇄 시 사진이 출력되지 않는 이슈해결 방안을 추가했습니다.



쿽레포트에 사진을 출력하려면 TQRImage, TQRDBImage 2개의 컴포넌트를 이용할 수 있습니다.

(TQRDBImage는 비트맵 데이터만 출력할 수 있습니다.)


저는 JPEG, GIF, PNG 등을 지원하기 위해 TQRImage를 이용합니다.


아래 델파이 샘플은 BOOK_THUMB(Blob 컬럼)의 데이터를 읽어 TQRImage에 표시하는 내용입니다.

Blob 컬럼을 읽기 위해 TBlobField를 사용하고, TWICImage를 이용해 다양한 포맷을 지원합니다.

(BLOB 컬럼에서 (이미지 등의)데이터 읽고 쓰기: http://blog.hjf.pe.kr/437)


레코드 별로 이미지를 표시하기 위해 TFDQuery의 AfterScroll 이벤트에 이미지 불러오는 코드를 작성합니다.

  private
    { Private declarations }
    FWicImage: TWICImage;
    FMemoryStream: TMemoryStream;
  public
    { Public declarations }
  end;
... 중략 ...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FWicImage := TWICImage.Create;
  FMemoryStream := TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FWicImage.Free;
  FMemoryStream.Free;
end;

procedure TForm1.FDQuery1AfterScroll(DataSet: TDataSet);
begin
  FMemoryStream.Clear;
  (FDQuery1.FieldByName('BOOK_THUMB') as TBlobField).SaveToStream(FMemoryStream);
  if FMemoryStream.Size = 0 then
    Exit;
  FWicImage.LoadFromStream(FMemoryStream);
  QRImage1.Picture.Assign(FWicImage);
end;

아래와 같이 보고서에 이미지를 출력할 수 있습니다.


== 내용 추가 ==

 2016.09.02 : 미리보기에서 사진이 나오는데, 실제 인쇄 시 사진이 출력되지 않는 이슈해결 방안


일부 프린터에서 고해상도 또는 크기가 큰 사진이 포함된 보고서가 출력되지 않아, 

아래와 같이 AfterScroll 이벤트 핸들러의 코드를 수정해 해결했습니다.

procedure TForm1.FDQuery1AfterScroll(DataSet: TDataSet);
var
  bmp: TBitmap;
begin
  FMemoryStream.Clear;
  (FDQuery1.FieldByName('BOOK_THUMB') as TBlobField).SaveToStream(FMemoryStream);
  if FMemoryStream.Size = 0 then
    Exit;

  FWicImage.LoadFromStream(FMemoryStream);

   // wic 이미지를 16비트 비트맵으로 변경
  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf16bit; // pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit
    bmp.Assign(FWicImage);

    // QRImage에 크기를 줄여 그리기
    QRImage1.Picture.Bitmap.Width := QRImage1.Width;
    QRImage1.Picture.Bitmap.Height := QRImage1.Height;
    QRImage1.Picture.Bitmap.Canvas.StretchDraw(Rect(0, 0, QRImage1.Width, QRImage1.Height), bmp);
  finally
    bmp.Free;
  end;
end;