Freigeben über


Dynamic Image Generation with ASP.Net

I've was playing around with image generation. Below is a picture of Josh who is a very interesting guy. His picture worked quite well because it was a clean slate to write text on.

The HTML tag <img src="https://www.rulesroost.com/josh.aspx?Text=Got%20Milk?"> produces:

 

And <img src="https://www.rulesroost.com/josh.aspx?Text=This%20is%20a%20much%20longer%20sentence."> shows:

 
  
 
 And here is the code for the aspx file:
 
1<%@ OutputCache Duration="500" VaryByParam="Text" %> 
2<%@ Page Language="C#" trace="false" Explicit="true" aspcompat="true" Debug="true" %> 
3<%@ Import Namespace="System" %> 
4<%@ Import Namespace="System.IO" %> 
5<%@ Import Namespace="System.Text" %> 
6<%@ Import Namespace="System.Drawing" %> 
7<%@ Import Namespace="System.Drawing.Imaging" %> 
8<%@ Import Namespace="System.Drawing.Text" %> 
9<%@ Import Namespace="System.Drawing.Drawing2D" %> 
10 
11<script runat="server"> 
12 private void Page_Load(object sender, System.EventArgs e) 
13 { 
14 Bitmap bitmap = new Bitmap(Server.MapPath("josh.bmp")); 
15 MemoryStream memStream = new MemoryStream(); 
16 
17 // generate image 
18 
19 // Create a graphics object for drawing. 
20 Graphics g = Graphics.FromImage(bitmap); 
21 g.SmoothingMode = SmoothingMode.AntiAlias; 
22 
23 int width = bitmap.Width; 
24 int height = bitmap.Height; 
25 
26 string familyName = "Tahoma"; 
27 string text = Request.Params["Text"]; 
28 
29 // get a rectangle on his shirt 
30 Rectangle rect = new Rectangle(150, 216, 210, 135); 
31 
32 // Set up the text font. 
33 Font font; 
34 font = new Font(familyName, 16F, FontStyle.Regular); 
35 
36 // Set up the text format. 
37 StringFormat format = new StringFormat(); 
38 format.Alignment = StringAlignment.Center; 
39 format.LineAlignment = StringAlignment.Center; 
40 
41 // Create a path using the text and warp it to fit over his contour 
42 GraphicsPath path = new GraphicsPath(); 
43 path.AddString(text, font.FontFamily, (int) font.Style, font.Size, rect, format); 
44 
45 PointF[] points = 
46 { 
47 new PointF(rect.X - 10, rect.Y - 8), 
48 new PointF(rect.X + rect.Width - 20, rect.Y + 4), 
49 new PointF(rect.X - 8, rect.Y + rect.Height - 15), 
50 new PointF(rect.X + rect.Width - 10, rect.Y + rect.Height + 4) 
51 }; 
52 Matrix matrix = new Matrix(); 
53 matrix.Translate(0F, 0F); 
54 path.Warp(points, rect, matrix, WarpMode.Perspective, 0F); 
55 
56 // Draw the text. 
57 HatchBrush hatchBrush = new HatchBrush( 
58 HatchStyle.LargeConfetti, 
59 Color.LightGray, 
60 Color.DarkGray); 
61 
62 g.FillPath(hatchBrush, path); 
63 
64 Response.Clear(); 
65 Response.ContentType="image/jpeg"; 
66 bitmap.Save(memStream, ImageFormat.Jpeg); 
67 memStream.WriteTo(Response.OutputStream); 
68 
69 // Clean up. 
70 font.Dispose(); 
71 hatchBrush.Dispose(); 
72 g.Dispose(); 
73 bitmap.Dispose(); 
74 
75 } 
76 
77</script> 
78
 
 Notice the Reponse.ContentType="image/jpeg" - that causes the output to be a picture and not HTML. 
 Also notice the word-wrap is done for me with the StringFormat object.
 Other resources:

Comments

  • Anonymous
    August 16, 2004
    The image appears to be pretty good in quality. Did you have to deal with the problems addressed in the following article:

    http://msdn.microsoft.com/library/en-us/dnaspp/html/colorquant.asp?frame=true

    If not, how did you get around them?

    david

  • Anonymous
    August 16, 2004
    Wow that article talks about fancier stuff than I even had in mind. I wonder if, because I am loading from a 24-bit BMP, and not a JPEG or GIF I don't experience the image quality issue. I'll have to read that whole article and try to understand it.

  • Anonymous
    August 16, 2004
    I can't wait until ASP.NET 2.0.. with ASIX files!

  • Anonymous
    August 17, 2004
    Christmas in August.

  • Anonymous
    August 17, 2004
    "I can't wait until ASP.NET 2.0.. with ASIX files! "
    That's bad luck, then, 'cos they've been cut.

  • Anonymous
    August 20, 2004
    And now MS has removed Dynamic Image generation from 2.0.

    Most annoying.

  • Anonymous
    September 09, 2004
    could you use this method to do multiline stuff by recognising something like carriage returns. I want to do something like
    " I "
    " LIKE "
    " ASP "

  • Anonymous
    November 25, 2007
    PingBack from http://feeds.maxblog.eu/item_1144962.html

  • Anonymous
    April 24, 2008
    PingBack from http://tommysetiawan.com/blog/?p=8

  • Anonymous
    May 26, 2009
    PingBack from http://webdevelopment.mobiforumz.com/2005/06/16/how-to-generate-an-image-dynamically-with-aspnet/