<%@ WebHandler Language="C#" Class="Word" %>
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Drawing.Text;
using System.Web.Hosting;
using System.Drawing.Drawing2D;
public class Word : IHttpHandler
{
//為避免在Web Server上要加裝字型檔的部署需求,自行載入字型
static PrivateFontCollection myOwnFonts =
new PrivateFontCollection();
//在靜態建構式中載入
static Word()
{
//截入預先準備好的字型檔案
myOwnFonts.AddFontFile(
HostingEnvironment.MapPath("~/App_Data/TRACE.TTF"));
}
//傳入字型大小,取得Font物件
private static Font GetTraceFont(float fontSz)
{
return new Font(myOwnFonts.Families[0], fontSz);
}
//建立一個虛的Graphic物件,以便MeasureString預測字型尺寸
static Bitmap bmpPreview = new Bitmap(10, 10);
static Graphics gPreview = Graphics.FromImage(bmpPreview);
private static Size MeasureSize(string text, float fontSz)
{
lock (gPreview) //For Thread-Safe
{
return gPreview.MeasureString(text,
GetTraceFont(fontSz)).ToSize();
}
}
public void ProcessRequest(HttpContext context)
{
float fs; //Font Size 字型大小
if (!float.TryParse(context.Request["fs"], out fs)) fs = 96;
string txt = context.Request["t"] ?? "Darkthread";
int pd; //Padding 上下留白
if (!int.TryParse(context.Request["pd"], out pd)) pd = 15;
//預測文字尺寸
Size estSize = MeasureSize(txt, fs);
//由文字尺寸決定寬、高
int w = estSize.Width + pd * 2;
int.TryParse(context.Request["w"] ?? w.ToString(), out w);
int h = estSize.Height + pd * 2;
Color bc = ColorTranslator.FromHtml("0x" + //背景色
(context.Request["bc"] ?? "005f00"));
Color fc = ColorTranslator.FromHtml("0x" + //前景色
(context.Request["fc"] ?? "ffffff"));
Color lc = ColorTranslator.FromHtml("0x" + //輔助線顏色
(context.Request["lc"] ?? "ffff00"));
//建立畫布
Bitmap bmp = new Bitmap(w, h);
Graphics g = Graphics.FromImage(bmp);
//塗上背景色
Brush p = new SolidBrush(bc);
g.FillRectangle(p, 0, 0, bmp.Width, bmp.Height);
//設定文字反鋸齒
g.TextRenderingHint = TextRenderingHint.AntiAlias;
//劃輔助線
Pen pen = new Pen(new SolidBrush(lc));
foreach (int y in
new int[] { pd, pd + estSize.Height * 2 /3, pd + estSize.Height })
g.DrawLine(pen, 0, y, bmp.Width, y);
pen.DashStyle = DashStyle.Dot;
float dy = pd + estSize.Height * 0.25f;
g.DrawLine(pen, 0, dy, bmp.Width, dy);
//以前景色印上描圖文字
g.DrawString(txt, GetTraceFont(fs), new SolidBrush(fc), new PointF(pd, pd));
//將結果以PNG格式傳回
context.Response.ContentType = "image/png";
bmp.Save(context.Response.OutputStream, ImageFormat.Png);
}
public bool IsReusable { get { return false; } }
}