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;