Solved

GDI+ text looks bad

Posted on 2004-10-18
4
374 Views
Last Modified: 2013-12-03
I have written a "textimage.aspx" page that returns an image/jpeg formatted according to the following parameters:
text string, font name, font size, font color, back color
The output usually looks fine but when using certain colors a degraded quality becomes apparent. (see http://beta.s3m.net/gdi_test.jpg)
I really need to figure out how to improve the quality... any change that would move me closer to the photoshop/fireworks-rendered text would be very helpful.

Here is the code, stripped down to the necessary parts:

////////////////////

Response.Clear();
Response.ContentType = "image/jpeg";

Bitmap myBmp = TextToImage(str,fName,fSize,fColor,bColor,trim);
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
ImageCodecInfo[] objEncoders = ImageCodecInfo.GetImageDecoders();

for(int i=0;i<objEncoders.Length;i++)
{
      if(objEncoders[i].MimeType==Response.ContentType)
      {
            myBmp.Save(Response.OutputStream,objEncoders[i],eps);
            myBmp.Dispose();
            break;
      }
}

private Bitmap CreateImage(strText, strFontName, intFontSize, strForeColor, strBackColor)
{
      Color clrForeColor = ColorTranslator.FromHtml("#"+strForeColor);
      Color clrBackColor = ColorTranslator.FromHtml("#"+strBackColor);                  

      //get font path from DB of custom fonts

      PrivateFontCollection pfc = new PrivateFontCollection();
      pfc.AddFontFile(strFontPath);

      FontStyle myStyle = FontStyle.Regular;
      if(strFontName.ToLower().IndexOf("bold")>-1){myStyle = FontStyle.Bold;}
      if(strFontName.ToLower().IndexOf("italic")>-1){myStyle = FontStyle.Italic;}

      Font font=new Font(new FontFamily(strFontName,pfc),intFontSize, myStyle);

      Bitmap bmp = new Bitmap(1, 1, PixelFormat.Format24bppRgb);
      Graphics g = Graphics.FromImage(bmp);

      SizeF imageSize = g.MeasureString(strText,font);
      int intWidth = (int)imageSize.Width;
      int intHeight = (int)imageSize.Height;

      bmp = new Bitmap(intWidth, intHeight, PixelFormat.Format24bppRgb);
      g = Graphics.FromImage(bmp);
      g.Clear(clrBackColor);
      g.TextRenderingHint = TextRenderingHint.AntiAlias;
      g.DrawString(strText, font, new SolidBrush(clrForeColor),new PointF(0,0));
      g.CompositingQuality = CompositingQuality.HighQuality;
      pfc.Dispose();                  
      g.Flush();
      g.Dispose();
                  
      return bmp;
}
0
Comment
Question by:sexyrexy
[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
  • 3
4 Comments
 
LVL 2

Author Comment

by:sexyrexy
ID: 12344445
Sorry the function names and overloads don't match up I just mistyped when stripping it down. The necessary functionality is still obvious.
0
 
LVL 28

Accepted Solution

by:
mmarinov earned 200 total points
ID: 12344624
Hi sexyrexy,

have you tried with
Response.ContentType = "image/gif";


B..M
0
 
LVL 2

Author Comment

by:sexyrexy
ID: 12349272
Yes, I've had unreliable results with GDI's gif output... it seems to be using a preset websafe 256 palette when downconverting the Bitmap to 8-bit GIF, rather than building a palette based on the colors found in the bitmap. This makes the output splotchy and rough. (http://beta.s3m.net/gdi_gif.gif)
0
 
LVL 2

Author Comment

by:sexyrexy
ID: 12349906
mmarinov,
Thanks for suggesting a GIF type again. It prompted me to think about the fact that GDI uses a default palette and wonder whether a custom palette could be constructed based on the given bitmap, just like photoshop might. The following two articles were very helpful:

http://dotnetjunkies.com/WebLog/bsblog/archive/2004/01/26/6103.aspx
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/colorquant.asp

There are warnings that generating the palette on the fly has alot of overhead, but by using pointers (and also in my case my images have very few colors since they are just text) the CPU load is minimized.
0

Featured Post

Creating Instructional Tutorials  

For Any Use & On Any Platform

Contextual Guidance at the moment of need helps your employees/users adopt software o& achieve even the most complex tasks instantly. Boost knowledge retention, software adoption & employee engagement with easy solution.

Question has a verified solution.

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

Just a quick little trick I learned recently.  Now that I'm using jQuery with abandon in my asp.net applications, I have grown tired of the following syntax:      (CODE) I suppose it just offends my sense of decency to put inline VBScript on a…
In this Article, I will provide a few tips in problem and solution manner. Opening an ASPX page in Visual studio 2003 is very slow. To make it fast, please do follow below steps:   Open the Solution/Project. Right click the ASPX file to b…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
How to Install VMware Tools in Red Hat Enterprise Linux 6.4 (RHEL 6.4) Step-by-Step Tutorial

740 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