# ImageEn Faq

 After updating ImageEn I get the following error on start-up: "The procedure entry point ... could not be located in the dynamic link library PKIECtrl15.bpl" This means that a package - either one of ImageEn's or one of your own - is trying to access PKIECtrl15.bpl, but is failing because PKIECtrl15.bpl has been recompiled more recently. The error may be followed by another one that advised you which package is giving you the error: "Xyz package could not be loaded. Would you like to load it next time you run Delphi...". If you know which package has caused the problem, open it DPK file and recompile it. Otherwise, search your system for any PKIE*.* and DPKIE*.* files and remove them (it might help to review the library paths under Tools > Options, Library). Then reinstall ImageEn. If you still get the error, then you might have a package that links to ImageEn. Go through each of your packages and recompile any that use ImageEn.

 How do I install ImageMagick and GhostScript so that I can read PDF files? Please see the discussion on our forum at: http://www.imageen.com/ieforum/topic.asp?TOPIC_ID=1464

 How can I prevent the scrollwheel from causing the image to zoom? I want it to remain the original size at all times. Just write: ImageEnView1.MouseWheelParams.Action := iemwNone; other values are iemwVScroll and iemwZoom (default).

 How do I convert a GIF image to TIFF format without a visual component? There are several ways. The simplest is: var   mbmp:TIEMultiBitmap; Begin   mbmp := TIEMultiBitmap.Create;   mbmp.Read('D:\in.gif');   mbmp.Write('D:\out.tiff');   mbmp.free; End;

 Can I modify brightness? You can change brightness (luminosity) using several methods. Using IntensityRGBall method:   ImageEnView1.Proc.IntensityRGBall(20,20,20); // increment luminosity of 20 (the fastest) Using HSLvar method:   ImageEnView1.Proc.HSLvar(0,0,20); // increment luminosity of 20 (slow but more accurate) Using HSVvar method:   ImageEnView1.Proc.HSVvar(0,0,20); // increment luminosity of 20 (slow but more accurate)

 Can I modify scanner resolution? To change scan resolution to 300 on your scanner use: ImageEnView1.IO.TwainParams.XResolution.CurrentValue := 300; ImageEnView1.IO.TwainParams.YResolution.CurrentValue := 300; ImageEnView1.IO.Acquire;

 Is there any way to save a CMYK TIFF using ImageEn? To save TIFF with CMYK write: ImageEnView1.IO.Params.TIFF_PhotometInterpret := ioTIFF_CMYK; ImageEnView1.IO.SaveToFile('xxx.tif');

 How can I improve the performance of TImageEnMView when I have many thumbnails? Ensure you have optimized your settings to ensure the best performance: Most importantly, decide whether the TImageEnMView should load and store full size images. If you are loading the content of a multi-page file, such as TIFF, for editing and display purposes then generally you will want TImageEnMView.StoreType=ietNormal. However, if you are displaying thousands of photos from a folder, for example, then you are better to use load only thumbnails (TImageEnMView.StoreType is ietThumb or ietFastThumb) Load images only on demand (i.e. as they are displayed or needed). To do this, ensure the LoadOnDemand parameter is set for AppendImage, InsertImage, FillFromDirectory or FillFromFolder Lock updating while performing batch operations (LockUpdate/UnlockUpdate) Consider options to load EXIF thumbnails (TImageEnMView.EnableLoadEXIFThumbnails) or Windows Explorer thumbnails (TImageEnMView.EnableLoadExplorerThumbnails) Increasing the size of the image cache can help with general performance (TImageEnMView.ImageCacheSize), especially if you are using TImageEnMView.StoreType=ietFastThumb

 Is it possible to de/activate duplex on scanner? Write ImageEnView1.IO.TwainParams.DuplexEnabled := True (or False if you want to disable).

 I've added the ImageMagick DLL to my application folder, but ImageEn does not support its formats. What do I need to do? You can automatically register the plug-in DLLs using: IEAutoLoadIOPlugins(); Or manually using: IEAddExtIOPlugIn('jbiglib.dll'); IEAddExtIOPlugIn('imagemagick.dll'); Note: If ImageMagick has been installed on the system, ImageEn will automatically supports its formats.

 Can your component take a series of single page TIFF files and create a Multi-Page file from them? You can load the page using:   ImageEnView1.IO.LoadFromFile('page1.tif'); then save the page with:   ImageEnView1.IO.Params.TIFF_ImageIndex := 0; // increment this for each page   ImageEnView1.IO.InsertToFileTIFF('multipage.tif'); Otherwise you can use TImageEnMView and TImageEnMIO component. See "multi" example for more details.

 How do I change the current page of a TIFF image in TImageEnView? In order to load several pages from a TIFF you have two ways: 1) load a page at the time, using TImageEnView, example: ImageEnView1.IO.Params.TIFF_ImageIndex := page_number; // page_number stars from 0 (first page) ImageEnView1.IO.LoadFromFile('mytiff.tiff'); First instruction select the page to load. To know how many pages there are use: page_count := EnumTIFFIm('mytiff.tiff'); 2) load all pages, using TImageEnMView. Just write: ImageEnMView1.MIO.LoadFromFile('mytiff.tiff'); and you will see all pages.

 Is it possible to convert a multipage-image to a different encoding? G3 and G4 specifically? Using TImageEnMView you have to change the compression property for all pages: ImageEnMView1.MIO.LoadFromFile('original.tif'); // change compression for the first page ImageEnMView1.MIO.Params[0].TIFF_Compression := ioTIFF_G4FAX; // change compression for the other pages ImageEnMView1.MIO.DuplicateCompressionInfo; // now save ImageEnMView1.Mio.SaveToFile('output.tif');

 How can I improve performance when working with many layers? The main performance properties are: - LayersCaching: Caches the view of each layer. Much faster but uses more memory. - LayersFastDrawing: Display quality of layers (and whether the quality view is delayed). - ZoomFilter/DelayZoomFilter: Display quality of images (and whether the quality view is delayed). This option is ignored if LayersFastDrawing is active - LayersRotationUseFilterOnPreview: Whether the quality filter (LayersRotationFilter) is applied when previewing the image during rotation Here is some example code from the Layers_AllTypes demo: procedure Tfmain.cmbPreviewQualityChange(Sender: TObject); const   _cmbPreviewQuality_Fast = 0;   _cmbPreviewQuality_Delayed_Best = 1;   _cmbPreviewQuality_Best = 2; begin   // Separate code to make it easier to understand   if cmbPreviewQuality.ItemIndex = _cmbPreviewQuality_Fast then   begin     // FASTEST DISPLAY     // Zoom filter     ImageEnView1.ZoomFilter := rfNone;     ImageEnView1.DelayZoomFilter := False;     // Rotation anti-alias     ImageEnView1.LayersRotationFilter := ierBicubic;     ImageEnView1.LayersRotationAntialias := true;     ImageEnView1.LayersRotationUseFilterOnPreview := False;     // Fast drawing     ImageEnView1.LayersFastDrawing := iefFast;  end   else   if cmbPreviewQuality.ItemIndex = _cmbPreviewQuality_Delayed_Best then   begin     // DELAYED HIGH QUALITY     // Zoom filter     ImageEnView1.ZoomFilter := rfLanczos3;     ImageEnView1.DelayZoomFilter := True;     // Rotation anti-alias     ImageEnView1.LayersRotationFilter := ierBicubic;     ImageEnView1.LayersRotationAntialias := True;     ImageEnView1.LayersRotationUseFilterOnPreview := True;     // Fast drawing     ImageEnView1.LayersFastDrawing := iefDelayed;   end   else   begin     // HIGH QUALITY     // Zoom filter     ImageEnView1.ZoomFilter := rfLanczos3;     ImageEnView1.DelayZoomFilter := False;     // Rotation anti-alias     ImageEnView1.LayersRotationFilter := ierBicubic;     ImageEnView1.LayersRotationAntialias := True;     ImageEnView1.LayersRotationUseFilterOnPreview := True;     // Fast drawing     ImageEnView1.LayersFastDrawing := iefNormal;   end;   ImageEnView1.Update(); end; procedure Tfmain.chkLayerCachingClick(Sender: TObject); begin   if chkLayerCaching.Checked then     ImageEnView1.LayersCaching := -1   else     ImageEnView1.LayersCaching := 0; end;

 How can I display images "on demand" with TImageEnMView? There are several ways to display images "on demand": 1) If you have a directory where are all files just write: ImageEnMView1.FillFromDirectory('c:\myimages'); 2) When you add a new image just set ImageFileName[] index, and ImageEn will load automatically specified file when needed. Example: idx := ImageEnMView1.AppendImage; ImageEnMView1.ImageFileName[idx] := 'first.jpg'; 3) When you add a new image just set the ImageID[] property. You have to create by hand an array of filenames where to get images. Example: var   files:array [0..1] of string; begin   files[0] := 'first.jpg';   files[1] := 'second.jpg';   ImageEnMView1.ImageID[ ImageEnMView1.AppendImage ] := 0;   ImageEnMView1.ImageID[ ImageEnMView1.AppendImage ] := 1; end; You have also to create OnImageIDRequest event, on this you can write: procedure TForm1.OnImageIDRequest(Sender: TObject; ID:integer; var Bitmap:TBitmap); var   io:TImageEnIO; begin   io := TImageEnIO.Create(self);   io.AttachedBitmap := bmp; // bmp is a TBitmap object, defined at class level (must exists after the OnImageIDRequest exits)   io.LoadFromFile( files[ID] );   io.free;   Bitmap := bmp; end; 4) If the images are frames of a media file (like AVI, MPEG, etc..) you can write: ImageEnMView1.LoadFromFileOnDemand('film.mpeg');

 How do I burn the layers (Lines, Ellipses, etc) added in TImageEnView into the image? (Save them as a JPEG file) Lines, ellipses and other layers added to a TImageEnView can be merged to the background using the LayersMergeAll method, then save the image.

 How do I modify the IPTC fields without loading the original image? To load IPTC info from a jpeg, just use LoadFromFile method. After this you have in ImageEnView.IO.Params.IPTC_Info object all IPTC informations loaded. To read the caption you can write: ImageEnView.IO.LoadFromFile('image.jpg'); Idx := ImageEnView.IO. Params.IPTC_Info.IndexOf(2,120); Caption := ImageEnView.IO.Params.IPTC_Info.StringItem[idx]; this modify the caption: ImageEnView.IO.Params.IPTC_Info.StringItem[idx] := 'new caption'; ImageEnView.IO.SaveToFile('image2.jpg'); If you want to modify IPTC info without load the image use ParamsFromFile and InjectJpegIPTC methods, in this way: ImageEnView.IO.ParamsFromFile('one.jpg'); ...here modify the IPTC info ImageEnView.IO.InjectJpegIPTC('two.jpg');

 How do I print all the images in a multipage TIFF? You can connect a TImageEnIO to a TImageEnMView. TImageEnIO.PrintImage will print the selected image (use SelectedImage to change current selected image). In this way you can print all pages: for i := 0 to ImageEnMView1.ImageCount-1 do begin   ImageEnMView1.SeletedImage := i;   ImageEnIO.PrintImage... end; You can also use the predefined dialog of TImageEnMView component. Just write: ImageEnMView.MIO.DoPrintPreviewDialog;

 How I can save my jpeg without EXIF or other metadata? Call Params.ResetInfo. Example: ImageEnView.IO.LoadFromFile('input.jpg'); ImageEnView.IO.Params.ResetInfo; ImageEnView.IO.SaveToFile('output.jpg');

 How can I check if the TImageEnView is empty (no bitmap loaded)? To empty the component use "Blank" method. To check if it is empty use IsEmpty: If ImageEnView1.IsEmpty then ...

 When a user selects a page of the multipage TIFF image (using TImageEnMView) how do I display this image in a TImageEnView? To handle image selection use OnImageSelect event. To transfer current selected image use simply the Assign method: procedure TForm1.ImageEnMView1ImageSelect(Sender: TObject; idx: Integer); begin   ImageEnView1.Assign( ImageEnMView1.Bitmap ); end;

 How do I assign the image in one ImageEnView to another ImageEnView? Just use Assign method: ImageEnView1.Assign( ImageEnView2 ); or ImageEnView1.Assign( ImageEnView1.Bitmap ); // this doesn't copy DPI, but just the image

 Which is the correct way to load a Resource Image at runtime into an TImageEnView component, in C++? Here is a sample code:     TResourceStream *ResourceImage;     // Load from resource the About image ( a JPEG file).     ResourceImage = new TResourceStream((int)HInstance, "ABOUTBITMAP",RT_RCDATA);     MainForm->ImageAbout->IO->LoadFromStreamJpeg(ResourceImage);     delete ResourceImage; Here is a single line text file named "resource.rc" with the sentence: ABOUTBITMAP RCDATA "about.jpg" Just add the Resource file to the project and compile.

 How can I read custom TIFF tags? This example shows how read EXIF tags saved with Canon cameras: var   ms:TMemoryStream;   tagReader1,tagReader2,tagReader3:TIETifTagsReader;   i:integer;   // some Canon tags   m_nMacroMode,m_nLenghtTimer,m_Quality:integer;   m_ImageType:string; begin   with imageenvect1 do begin     IO.LoadFromFile('Capture_00006.JPG');     with IO.Params.JPEG_MarkerList do begin       i := IndexOf( JPEG_APP1 );       if i>=0 then begin         // there are EXIF info         ms := TMemoryStream.Create;         ms.Write( MarkerData[i][6], MarkerLength[i] ); // bypass first 4 bytes (must contain 'Exif')         ms.Position := 0;         tagReader1 := TIETifTagsReader.CreateFromStream( ms,0 ); // read TIFF's IFD         tagReader2 := TIETifTagsReader.CreateFromIFD( tagReader1, 34665 ); // read IFD in tag 34665 (SubEXIF)         tagReader3 := TIETifTagsReader.CreateFromIFD( tagReader2, $927c ); // read IFD in tag$927C (MarkerData - Canon IFD data)         // read Canon EXIF tags         m_nMacroMode := tagReader3.GetIntegerIndexed(1,1);         m_nLenghtTimer := tagReader3.GetIntegerIndexed(1,2);         m_Quality := tagReader3.GetIntegerIndexed(1,3);         m_ImageType := tagReader3.GetString(6);         tagReader3.Free;         tagReader2.Free;         tagReader1.Free;         ms.Free;       end;     end;   end; end;

 How do I compress my JPEGs to make them smaller? Jpeg is a file format with variable compression rate. The property that regulates the compression (and the quality) is JPEG_Quality. So you should set this property before save. Example: ImageEnView.IO.LoadFromFile('input.jpg'); ImageEnView.IO.Params.JPEG_Quality := 70; ImageEnView.IO.SaveToFile('output.jpg'); The default is 80, while other software uses 70. If you want estimate the value used to create your file, execute this: quality := IECalcJpegFileQuality('input.jpg'); So you could write: ImageEnView.IO.LoadFromFile('input.jpg'); ImageEnView.IO.Params.JPEG_Quality := IECalcJpegFileQuality('input.jpg'); ImageEnView.IO.SaveToFile('output.jpg'); If this is not enough, probably the file contains metatags (text info). To remove them execute: ImageEnView.IO.Params.ResetInfo; ..just before save.

 How do I load embedded JPEG images in a Raw file? // Load the embedded JPEG (loading a half size raw if there is no embedded JPEG) ImageEnView.IO.Params.RAW_GetEmbeddedJpeg := True; ImageEnView.IO.Params.RAW_HalfSize := True;

 How do I always create a polygon when inserting a polyline layer? Just set: // Always close polylines ImageEnView1.LayersAutoClosePolylines := iecmAlways;

 How do I read Camera RAW files? In order to read Camera RAW files you need to include ielib32.dll with your application.

 I get "Floating point overflow" on printing. Sometime this happens on shared printers and depends by VCL or printer drivers bug. Try to disable FPU exceptions executing this before your printing code: Set8087CW(\$133F);

 I see horizontal/vertical bands loading images using TImageEnMView. Why? By default, TImageEnMView loads EXIF thumbnails when they are available (with the thumbnail display method). Sometimes these thumbnails contain black bands (horizontal or vertical bands). To disable EXIF thumbnails loading set: TImageEnMView.EnableLoadEXIFThumbnails := false;