Writing and Reading Multi-Page Files (C++ Builder 4)

Take the following steps to create a Multi-Page file, then load and display the images from the file. Only TIFF (MPT) and PCX (DCX) formats support Multi-Page files.

1.

Start C++ Builder.

2.

If you didn’t install LEAD RasterView Control, install it.

 

On the Component pull-down menu, use the Import ActiveX Control… and select the LEAD RasterView Control (14.5), and Press install.

3.

image\btnlead.gif Select the LEAD RasterView control; then add two controls to your main form. The size and position does not matter.

4.

image\btncmd.gif Add a button to your form and name it as follows:

 

Name

Caption

 

Button1

Load Multi-Page File

5.

Code the Button1 Click’s procedure as the following. In online help, you can use the Edit pull-down menu to copy the block of code. This code loads two bitmaps, saves them both into a single Multi-Page TIFF file, loads them again from the TIFF file, and displays them side-by-side.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 LEADRasterIO * pRasterIO1;
 LEADRasterIO * pRasterIO2 ;
 int HeightFactor1, WidthFactor1;
 int HeightFactor2, WidthFactor2;
 int HeightAllowed, WidthAllowed;
 int ImageWidth1, ImageHeight1;
 int ImageWidth2, ImageHeight2;

 CoCreateInstance(CLSID_LEADRasterIO, NULL, CLSCTX_ALL, IID_ILEADRasterIO, (void**)&pRasterIO1);
 CoCreateInstance(CLSID_LEADRasterIO, NULL, CLSCTX_ALL, IID_ILEADRasterIO, (void**)&pRasterIO2);

 //Disable automatic repainting of the image.
 LEADRasterView1->AutoRepaint = False;
 LEADRasterView2->AutoRepaint = False;
 //Turn off scroll bars to make sure we use the full client area
 LEADRasterView1->AutoScroll = False;
 LEADRasterView2->AutoScroll = False;
 //Position and size the main form so that it takes up most of the screen
 Width = Screen->Width * 0.9 ;
 Height= Screen->Height* 0.8 ;
 Left = (Screen->Width- Width) / 2;
 Top = (Screen->Height- Height)/ 2;
 //Display the form and set the mouse pointer to an hourglass

 Screen->Cursor = crHourGlass;
 //Load the bitmaps-> These hard-coded path names may be different on your system
 pRasterIO1->Load ( LEADRasterView1->Raster, AnsiToOLESTR("v:\\images\\image1.cmp"),0, 0, 1 ) ;
 pRasterIO2->Load ( LEADRasterView2->Raster, AnsiToOLESTR("v:\\images\\image2.cmp"),0, 0, 1 ) ;

 //Save the bitmaps to a single multipage TIFF file
 pRasterIO1->Save ( LEADRasterView1->Raster, AnsiToOLESTR("v:\\images\\combined.mpt"), FILE_TIF, 24,(QFactorConstants)0, SAVE_OVERWRITE);
 pRasterIO2->Save ( LEADRasterView2->Raster, AnsiToOLESTR("v:\\images\\combined.mpt"), FILE_TIF, 24,(QFactorConstants)0, SAVE_APPEND);
 //Get information about the images so that we can size the controls
 pRasterIO1->GetFileInfo ( LEADRasterView1->Raster, WideString("v:\\images\\combined.mpt"), 1, 0 ) ;
 pRasterIO2->GetFileInfo ( LEADRasterView2->Raster, WideString("v:\\images\\combined.mpt"), 2, 0 );
 //Clear the bitmaps from memory
 LEADRasterView1->Raster->Bitmap = 0;
 LEADRasterView2->Raster->Bitmap = 0;
 //Make the controls visible so that we can size and position them
 //They will not really appear until we load an image and paint it
 LEADRasterView1->Visible = True;
 LEADRasterView2->Visible = True;
 //Set the variables used for preserving the aspect ratio
 HeightFactor1 = pRasterIO1->InfoHeight;
 WidthFactor1 = pRasterIO1->InfoWidth;
 HeightFactor2 = pRasterIO2->InfoHeight;
 WidthFactor2 = pRasterIO2->InfoWidth;
 HeightAllowed = Height * 0.8;
 WidthAllowed = Width * 0.45;
 //Center each LEAD control on half of the form, preserving the aspect ratio
 //Check to see if using the maximum width will make the image too tall
 //Set the dimensions based on the result
 if ((WidthAllowed * HeightFactor1) / WidthFactor1 < HeightAllowed)
 {
 LEADRasterView1->Left = (Width / 4) - (WidthAllowed / 2);
 LEADRasterView1->Width = WidthAllowed;
 LEADRasterView1->Height = (LEADRasterView1->Width * HeightFactor1) / WidthFactor1;
 LEADRasterView1->Top = (Height - LEADRasterView1->Height) / 2;
 }
 else
 {
 LEADRasterView1->Top = (Height - HeightAllowed) / 2;
 LEADRasterView1->Height = HeightAllowed;
 LEADRasterView1->Width = (LEADRasterView1->Height * WidthFactor1) / HeightFactor1;
 LEADRasterView1->Left = (Width / 4) - (LEADRasterView1->Width / 2);
 }
 if ((WidthAllowed * HeightFactor2) / WidthFactor2 < HeightAllowed)
 {
 LEADRasterView2->Left = (Width * 3 / 4) - (WidthAllowed / 2);
 LEADRasterView2->Width = WidthAllowed;
 LEADRasterView2->Height = (LEADRasterView2->Width * HeightFactor2) / WidthFactor2;
 LEADRasterView2->Top = (Height - LEADRasterView2->Height) / 2;
 }
 else
 {
 LEADRasterView2->Top = (Height - HeightAllowed) / 2;
 LEADRasterView2->Height = HeightAllowed;
 LEADRasterView2->Width = (LEADRasterView2->Height * WidthFactor2) / HeightFactor2;
 LEADRasterView2->Left = (Width * 3 / 4) - (LEADRasterView2->Width / 2);
 }
 //Load the bitmaps from the multipage TIFF file
 pRasterIO1->Load ( LEADRasterView1->Raster, AnsiToOLESTR("v:\\images\\combined.mpt"), 24, 1, 1);
 pRasterIO2->Load ( LEADRasterView2->Raster, AnsiToOLESTR("v:\\images\\combined.mpt"), 24, 2, 1);
 //Set the image display sizes to match the LEAD controls
 ImageWidth1 = LEADRasterView1->ScaleWidth;
 ImageHeight1 = LEADRasterView1->ScaleHeight;
 LEADRasterView1->SetDstRect ( 0, 0, ImageWidth1, ImageHeight1);
 LEADRasterView1->SetDstClipRect ( 0, 0, ImageWidth1, ImageHeight1);
 //Set the image display sizes to match the LEAD controls
 ImageWidth2 = LEADRasterView2->ScaleWidth;
 ImageHeight2 = LEADRasterView2->ScaleHeight;
 LEADRasterView2->SetDstRect ( 0, 0, ImageWidth2, ImageHeight2);
 LEADRasterView2->SetDstClipRect (0, 0, ImageWidth2, ImageHeight2);

 //Display the images
 LEADRasterView1->ForceRepaint () ;
 LEADRasterView2->ForceRepaint() ;
  pRasterIO1->Release ();
  pRasterIO2-> Release();
 //Set the mouse pointer back to the default
 Screen->Cursor= crDefault;
}

6.

On the Project pull-down menu, use the Import Type library… and select the LEAD Raster IO object library (14.5).

7.

At the beginning of the Unit1.cpp file, include the file:

#include "Ltrasteriolib_tlb.h" 

8.

Run your program to test it.