Code Based - General
I need to be able to print JPEG's. How would I do that?
This can be done through the use of the PrintImageRect method and OnDecodeImage event. These allow native image format storage (such as JPG or TIFF) in the Rave file (the one created by TReportFiler) for space savings. The PrintImageRect method is called with the X1,Y1,X2,Y2 parameters like PrintBitmapRect; but instead of a bitmap object, a stream containing the image data and an optional identifier is passed. Here is some sample code from an OnPrint event.
Delphi Example:
uses JPEG; procedure TForm1.ReportSystem1Print(Sender: TObject); var Stream: TMemoryStream; Image: TJPEGImage; begin With Sender as TBaseReport do begin Stream := TMemoryStream.Create; Image := TJPEGImage.Create; try Image.LoadFromFile('image1.jpg'); Image.SaveToStream(Stream); Stream.Position := 0; PrintImageRect(1,1,3,3.5,Stream,'JPG'); finally Image.Free; Stream.Free; end; { tryf } end; { with } end;
C++Builder Example:
#include#define TBitmap Graphics::TBitmap void __fastcall TForm1::ReportSystem1Print(TObject *Sender) { TBaseReport* bp = dynamic_cast (Sender); TMemoryStream* Stream; TJPEGImage* Image; Stream = new TMemoryStream(); Image = new TJPEGImage(); try { Image->LoadFromFile("image1.jpg"); Image->SaveToStream(Stream); Stream->Position = 0; bp->PrintImageRect(1,1,3,3,Stream,"JPG"); }// try __finally { delete Image; delete Stream; }// tryf }
The previous code will store the JPG in its native format in the report file. The next step is to define an OnDecodeImage event to allow Rave to convert this image data to a bitmap when it needs it. This would normally appear on a TFilePrinter or TFilePreview component, but can also be defined in a TReportSystem component. Here's an example of an OnDecodeImage event.
Delphi Example:
procedure TForm1.ReportSystem1DecodeImage(Sender: TObject; ImageStream: TStream; ImageType: String; Bitmap: TBitmap); var Image: TJPEGImage; begin If ImageType = 'JPG' then begin Image := TJPEGImage.Create; // Create a TJPEGImage class try Image.LoadFromStream(ImageStream); // Load up JPEG image from ImageStream Image.DIBNeeded; // Convert JPEG to bitmap format Bitmap.Assign(Image); finally Image.Free; end; end; { if } end;
C++Builder Example:
void __fastcall TForm1::ReportSystem1DecodeImage(TObject *Sender, TStream *ImageStream, AnsiString ImageType, TBitmap *Bitmap) { TJPEGImage* Image; if (ImageType == "JPG") { Image = new TJPEGImage(); // Create a TJPEGImage class try { Image->LoadFromStream(ImageStream); // Load up JPEG image from ImageStream Image->DIBNeeded(); // Convert JPEG to bitmap format Bitmap->Assign(Image); }// try __finally { delete Image; }// tryf }// if }