• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 832
  • Last Modified:

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:

   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));

...

...

Open in new window




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(solidWhiteBrush, 0, 0, bm.Width, bm.Height);
                g.DrawString(AnnotationText, AnnotationFont, solidBlackBrush, new PointF(7f, 2f));


And what libraries do I need to include to get to the Direct2D methods?

Thank you!
0
Tom Knowlton
Asked:
Tom Knowlton
  • 5
  • 4
1 Solution
 
Bob LearnedCommented:
Hey, it looks like you already figured out how to annotate!!

I haven't compared DirectX to GDI+, but my guess is that DirectX would give you the performance over GDI+.
0
 
Tom KnowltonWeb developerAuthor Commented:
I am abandoning this strategy.

Direct2D is too low level for our purposes.
0
 
Bob LearnedCommented:
May I ask about your "purposes"?  What are your requirements?
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

 
Tom KnowltonWeb developerAuthor Commented:
>>>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:

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;      

        }

Open in new window




Having to create a Bitmap from the MemoryStream  (and at the end, the reverse happens) seems too "heavy" and inefficient.
0
 
Bob LearnedCommented:
How many images would you need to annotate during a single run?
0
 
Tom KnowltonWeb developerAuthor Commented:
>>>How many images would you need to annotate during a single run?

This is not known until runtime.  Typically, 4 to 6 images.
0
 
Bob LearnedCommented:
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?
0
 
Tom KnowltonWeb developerAuthor Commented:
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.  :)
0
 
Bob LearnedCommented:
Have you profiled this to see what takes the most time in the 1 second?
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now