Solved

Direct2D, Windows 7 and C#

Posted on 2012-04-12
9
791 Views
Last Modified: 2012-04-13
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
Comment
Question by:Tom Knowlton
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
9 Comments
 
LVL 96

Accepted Solution

by:
Bob Learned earned 500 total points
ID: 37842654
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
 
LVL 5

Author Closing Comment

by:Tom Knowlton
ID: 37842695
I am abandoning this strategy.

Direct2D is too low level for our purposes.
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37842705
May I ask about your "purposes"?  What are your requirements?
0
Forrester Webinar: xMatters Delivers 261% ROI

Guest speaker Dean Davison, Forrester Principal Consultant, explains how a Fortune 500 communication company using xMatters found these results: Achieved a 261% ROI, Experienced $753,280 in net present value benefits over 3 years and Reduced MTTR by 91% for tier 1 incidents.

 
LVL 5

Author Comment

by:Tom Knowlton
ID: 37842748
>>>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
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37842794
How many images would you need to annotate during a single run?
0
 
LVL 5

Author Comment

by:Tom Knowlton
ID: 37842809
>>>How many images would you need to annotate during a single run?

This is not known until runtime.  Typically, 4 to 6 images.
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37842819
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
 
LVL 5

Author Comment

by:Tom Knowlton
ID: 37842883
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
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37843080
Have you profiled this to see what takes the most time in the 1 second?
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question