Solved

GDI+ text looks bad

Posted on 2004-10-18
4
373 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
  • 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

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

I have developed many web applications with asp & asp.net and to add and use a dropdownlist was always a very simple task, but with the new asp.net, setting the value is a bit tricky and its not similar to the old traditional method. So in this 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…

749 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