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;