ImageEn for Delphi and C++ Builder ImageEn for Delphi and C++ Builder

 

ImageEn Forum
Profile    Join    Active Topics    Forum FAQ    Search this forumSearch
 All Forums
 ImageEn Library for Delphi, C++ and .Net
 ImageEn and IEvolution Support Forum
 PrintImage with transparent background

Note: You must be registered in order to post a reply.
To register, click here. Registration is FREE!

View 
UserName:
Password:
Format  Bold Italicized Underline  Align Left Centered Align Right  Horizontal Rule  Insert Hyperlink   Browse for an image to attach to your post Browse for a zip to attach to your post Insert Code  Insert Quote Insert List
   
Message 

 

Emoji
Smile [:)] Big Smile [:D] Cool [8D] Blush [:I]
Tongue [:P] Evil [):] Wink [;)] Black Eye [B)]
Frown [:(] Shocked [:0] Angry [:(!] Sleepy [|)]
Kisses [:X] Approve [^] Disapprove [V] Question [?]

 
Check here to subscribe to this topic.
   

T O P I C    R E V I E W
jrpcguru Posted - Jun 06 2016 : 19:01:52
I'm using ImageEnView layer 0 to display a scanned document and layer 1 to draw selection boxes so I can capture the coordinates of each field to fill in on the document. This works well and I can use ImageEnView1.Proc.TextOut to place the desired text into each field on the scanned document.

I thought it would be easy to make layer 0 invisible, layer 1 transparent and then print the desired text onto black documents. However I always get a gray background for layer 1 when printing. I'm sure I'm missing something here. How does one convince ImageEn to print only the text created with TextOut?

J.R.
12   L A T E S T    R E P L I E S    (Newest First)
jwest Posted - Jun 09 2016 : 18:58:55
Hi, good. I have seen Mr Nigel answered you.
xequte Posted - Jun 09 2016 : 18:30:41
I'll investigate a performance fix.



Nigel
Xequte Software
www.xequte.com
nigel@xequte.com
jrpcguru Posted - Jun 09 2016 : 17:22:39
There is really a huge difference in speed. To use the first overload I would need to keep everything hidden with an hourglass while it processes. The gap between displaying layer 0 and filling layer 1 with text is several seconds.

With the alternative methods that you have helped me to discover, it displays almost instantaneously. A user won't even realize that two separate layers have loaded and displayed.

Thank you for the help.

I'm using Win 7 Pro with 12 gig of ram and a 2 core i7 cpu, if that has anything to do with font creation speed.

J.R.
xequte Posted - Jun 09 2016 : 17:04:27
Well the only difference is the first TextOut overload needs to create a TFont object. Though I'm surprised font creation should be so noticeably slow.

Nigel
Xequte Software
www.xequte.com
nigel@xequte.com
jrpcguru Posted - Jun 09 2016 : 15:37:43

  ImageEnView1.LockUpdate ;

  ImageEnView1.IEBitmap.Canvas.Font.Name := 'Arial';
ImageEnView1.IEBitmap.Canvas.Font.Size := 36;
ImageEnView1.IEBitmap.Canvas.Font.Color := clRed;
ImageEnView1.IEBitmap.Canvas.Font.Style := [fsBold];

  for I := 0 to 2 do
    begin


ImageEnView1.IEBitmap.Canvas.Font.Size := 36;
      ImageEnView1.Layers[1].Bitmap.Canvas.TextOut(iDateLeft,iDateTop + (i * iCheckHeightLocal), 'MM/DD/YYYY ') ;
      ImageEnView1.Layers[1].Bitmap.Canvas.TextOut(iPayeeLeft,iPayeeTop + (i * iCheckHeightLocal), sField) ;
      ImageEnView1.Layers[1].Bitmap.Canvas.TextOut(iNumericDollarsLeft,iNumericDollarsTop + (i * iCheckHeightLocal), '999999999') ;
      ImageEnView1.Layers[1].Bitmap.Canvas.TextOut(iTextDollarsLeft,iTextDollarsTop + (i * iCheckHeightLocal), sDollars) ;
ImageEnView1.IEBitmap.Canvas.Font.Size := 24;
      ImageEnView1.Layers[1].Bitmap.Canvas.TextOut(iMemoLeft,iMemoTop + (i * iCheckHeightLocal), sMemo) ;
ImageEnView1.UnLockUpdate;



This executes just as fast as displaying the image and is simpler than my previous code using the first syntax of proc.TextOut. I wonder if we have identified an inefficiency in the first syntax of Proc.TextOut?

J.R.
jwest Posted - Jun 09 2016 : 15:00:58
What happend if you use:

ImageEnView1.Layers[X].Bitmap.Canvas.TextOut(x,y,text) where X is your layer index instead of
ImageEnView1.Proc.TextOut(iDateLeft, iDateTop + (i * iCheckHeightLocal), 'MM/DD/YYYY ', Nil, 0, false);
jrpcguru Posted - Jun 09 2016 : 14:07:57
The first syntax is virtually as fast as displaying the Layer0 image. The second syntax remains deathly slow even with LockUpdate and UnLockUpdate;


J.R.
jwest Posted - Jun 09 2016 : 13:52:25
What about to call ImageEnView1.LockUpdate before the loop and ImageEnView1.UnLockUpdate after it?
jrpcguru Posted - Jun 09 2016 : 11:08:28
I did not try LayersCreateFromText. It does not appear to allow me to place text at the desired coordinates.

Here is the code that is slow (the slowness is all inside the loop):

  ImageEnView1.LayersAdd;
  ImageEnView1.Proc.Fill( CreateRGB( 255,255,255 ) );

      ImageEnView1.Layers[1].Opacity := 0.45;
      ImageEnView1.Layers[1].Visible := true;

  for I := 0 to 2 do
    begin

      ImageEnView1.Proc.TextOut(iDateLeft, iDateTop + (i * iCheckHeightLocal), 'MM/DD/YYYY ', 'Arial', 36, clBlack, [fsBold]);
      ImageEnView1.Proc.TextOut(iPayeeLeft, iPayeeTop + (i *  iCheckHeightLocal), sField, 'Arial', 36, clBlack, [fsBold]);
      ImageEnView1.Proc.TextOut(iNumericDollarsLeft , iNumericDollarsTop + (i *  iCheckHeightLocal) , '999999999', 'Arial', 36, clBlack, [fsBold]);
      ImageEnView1.Proc.TextOut(iTextDollarsLeft , iTextDollarsTop + (i *  iCheckHeightLocal) , sDollars, 'Arial', 36, clBlack, [fsBold]);
      ImageEnView1.Proc.TextOut(iMemoLeft , iMemoTop + (i *  iCheckHeightLocal) , sMemo, 'Arial', 24, clBlack, [fsBold]);
end;

  ImageEnView1.Proc.SetTransparentColors(
     CreateRGB( 255, 255, 255 ),
     CreateRGB( 255, 255, 255 ), 0 );    


I thought I had tried the first syntax for TextOut, but apparently not. I now find that this code is very quick, though I don't understand why I need to repeat the font setting on the canvas:

  for I := 0 to 2 do
    begin
		ImageEnView1.IEBitmap.Canvas.Font.Name := 'Arial';
		ImageEnView1.IEBitmap.Canvas.Font.Size := 36;
		ImageEnView1.IEBitmap.Canvas.Font.Color := clRed;
		
			  ImageEnView1.Proc.TextOut(iDateLeft, iDateTop + (i * iCheckHeightLocal), 'MM/DD/YYYY ', Nil, 0, false);
			  
		ImageEnView1.IEBitmap.Canvas.Font.Name := 'Arial';
		ImageEnView1.IEBitmap.Canvas.Font.Size := 36;
		ImageEnView1.IEBitmap.Canvas.Font.Color := clRed;
		
			  ImageEnView1.Proc.TextOut(iPayeeLeft, iPayeeTop + (i *  iCheckHeightLocal), sField, Nil, 0, false);
			  
		ImageEnView1.IEBitmap.Canvas.Font.Name := 'Arial';
		ImageEnView1.IEBitmap.Canvas.Font.Size := 36;
		ImageEnView1.IEBitmap.Canvas.Font.Color := clRed;
		
			  ImageEnView1.Proc.TextOut(iNumericDollarsLeft , iNumericDollarsTop + (i *  iCheckHeightLocal) , '999999999', Nil, 0, false);
			  
		ImageEnView1.IEBitmap.Canvas.Font.Name := 'Arial';
		ImageEnView1.IEBitmap.Canvas.Font.Size := 36;
		ImageEnView1.IEBitmap.Canvas.Font.Color := clRed;
		
			  ImageEnView1.Proc.TextOut(iTextDollarsLeft , iTextDollarsTop + (i *  iCheckHeightLocal) , sDollars, Nil, 0, false);
			  
		ImageEnView1.IEBitmap.Canvas.Font.Name := 'Arial';
		ImageEnView1.IEBitmap.Canvas.Font.Size := 24;
		ImageEnView1.IEBitmap.Canvas.Font.Color := clRed;
		
			  ImageEnView1.Proc.TextOut(iMemoLeft , iMemoTop + (i *  iCheckHeightLocal) , sMemo, Nil, 0, false);   
end;


I'm wondering if I'm doing something wrong with the second syntax for TextOut. The first syntax clearly works well now, if I set the canvas before each TextOut. If not it sometimes reverts to a much smaller font.

J.R.
xequte Posted - Jun 09 2016 : 00:17:29
Hi JR

Moving back a step, did you try using LayersCreateFromText:

http://www.imageen.com/help/TImageEnView.LayersCreateFromText.html

If you are experiencing slowness, can you advise how the steps to reproduce it?

Nigel
Xequte Software
www.xequte.com
nigel@xequte.com
jrpcguru Posted - Jun 07 2016 : 13:59:33
Boy did I have a typo. I'm trying to print text onto Blank, not Black documents.

I reviewed several demo programs to help start my current program. I used the Layers demo to learn about layers and PrintProjects to learn about printing. But I missed the TextOut example in the Layers demo. It provides the solution. Apparently ImageEnView1.Layers[1].Transparency is not what is needed to make the layer transparent for printing. This seems to work:

ImageEnView1.LayersAdd;
ImageEnView1.Proc.Fill( CreateRGB( 255,255,255 ) );
{use ImageEnView1.Proc.TextOut to place the text over each data field displayed in layer 0}
ImageEnView1.Proc.SetTransparentColors(
CreateRGB( 255, 255, 255 ),
CreateRGB( 255, 255, 255 ), 0 ); // remove the white, making it as transparent

So my original question is answered. Thank you.

But I find another question. I have 15 text fields to fill via TextOut. The underlying image displays in layer 0 nearly instantly, but TextOut seems notably slow to finish overlaying the text. Is this normal? I have tried both forms of TextOut, just in case listing the font for each TextOut was less efficient than setting it once on the canvas. No significant improvement.


J.R.
xequte Posted - Jun 07 2016 : 00:17:41
Hi JR

Can you give me the steps to reproduce this issue in our of our demos.



Nigel
Xequte Software
www.xequte.com
nigel@xequte.com