Tom Knowlton
asked on
Direct2D, Windows 7 and C#
If I want better performance in doing a simple annotation, is it accurate to say that I should be using Direct2D instead of GDI+ under Windows 7?
I am writing a C# console application. At one point, it is currently using System.Drawing.Graphics (which is GDI+ essentially) to do the annotation, like this:
Is there a faster way to be doing this?
What would be the "Direct2D" way to write these 2 lines of code, specifically:
g.FillRectangle(solidWhite Brush, 0, 0, bm.Width, bm.Height);
g.DrawString(AnnotationTex t, AnnotationFont, solidBlackBrush, new PointF(7f, 2f));
And what libraries do I need to include to get to the Direct2D methods?
Thank you!
I am writing a C# console application. At one point, it is currently using System.Drawing.Graphics (which is GDI+ essentially) to do the annotation, like this:
using (Graphics g = Graphics.FromImage(bm))
using (SolidBrush solidWhiteBrush = new SolidBrush(Color.White))
using (SolidBrush solidBlackBrush = new SolidBrush(Color.Black))
{
// Write out annotation text
g.FillRectangle(solidWhiteBrush, 0, 0, bm.Width, bm.Height);
g.DrawString(AnnotationText, AnnotationFont, solidBlackBrush, new PointF(7f, 2f));
...
...
Is there a faster way to be doing this?
What would be the "Direct2D" way to write these 2 lines of code, specifically:
g.FillRectangle(solidWhite
g.DrawString(AnnotationTex
And what libraries do I need to include to get to the Direct2D methods?
Thank you!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
May I ask about your "purposes"? What are your requirements?
ASKER
>>>May I ask about your "purposes"? What are your requirements?
-It is a console app, so no winforms or GUI of any kind.
-Said console app is to take a series of TIFF images and annotate them (add text to the upper left corner of the TIFF image.
Here is the current code, which I want to optimize:
Having to create a Bitmap from the MemoryStream (and at the end, the reverse happens) seems too "heavy" and inefficient.
-It is a console app, so no winforms or GUI of any kind.
-Said console app is to take a series of TIFF images and annotate them (add text to the upper left corner of the TIFF image.
Here is the current code, which I want to optimize:
public MemoryStream Annotate(MemoryStream InputImage, string AnnotationText, Font AnnotationFont)
{
InputImage.Position = 0;
Bitmap bImagem = new Bitmap(InputImage);
PixImage pImage = new PixImage();
pImage.Import(bImagem);
PixTools.Annotation.AnnotationDocument annotationDoc = new PixTools.Annotation.AnnotationDocument();
PixTools.Annotation.TextAnnotation textItem = new PixTools.Annotation.TextAnnotation();
textItem.Text = new PixTools.Annotation.ItemText(AnnotationText);
annotationDoc.Items.Add(textItem);
Console.WriteLine("LEAD TOOLS ANNOTATE - no print top");
PixImage newpi = pImage.MergeAnnotations(annotationDoc, MergeAttributes.MergeColorFormatPreserve, null);
Bitmap anotherBitmap = newpi.GetBitmap();
MemoryStream ms = new MemoryStream();
anotherBitmap.Save(ms, ImageFormat.Tiff);
ms.Position = 0;
return ms;
}
Having to create a Bitmap from the MemoryStream (and at the end, the reverse happens) seems too "heavy" and inefficient.
How many images would you need to annotate during a single run?
ASKER
>>>How many images would you need to annotate during a single run?
This is not known until runtime. Typically, 4 to 6 images.
This is not known until runtime. Typically, 4 to 6 images.
I was thinking that you needed to process 1000's of files, which would require careful attention to detail. 4 to 6 doesn't sound like you have a big need for optimization. How fast is this running currently?
ASKER
It is taking about 1 second per file.
But I should mention - we are in fact in a scalable environment.
The code should be written as if 1,000's of file might be processed.
Let's proceed as if that were true....if that is agreeable. :)
But I should mention - we are in fact in a scalable environment.
The code should be written as if 1,000's of file might be processed.
Let's proceed as if that were true....if that is agreeable. :)
Have you profiled this to see what takes the most time in the 1 second?
ASKER
Direct2D is too low level for our purposes.