C# 背景加文字一记
2020-02-25 本文已影响0人
triplestudio
缘由
图标难找,故思以圆为底浮一字于上作为通用图标方案。
找一圆底图
绘制文字
流程 File -> Bitmap -> Graphics -> Draw*** -> return Bitmap;
绘制文字使用 Graphics.DrawString(text,...) 即可。
问题及解
问题一:默认图片会变得模糊
对于网络带宽与流量还是考虑因素的时代,其实这个默认的质量也有道理。
通过设置以下属性可解:
Graphics.SmoothingMode
Graphics.InterpolationMode
Graphics.CompositingQuality
问题二:文字有锯齿
通过设置 Graphics.TextRenderingHint 属性可调优。
问题二:文字位置问题
DrawString 需要指定起始位置,如果需要文字居中,则计算依赖于文字最终会占的宽度。
还真提供了这样的方法:
使用 Graphics.MeasureString(text, Font); 可得到文字所需的宽与高。
那起始位置 = 中点 - 占宽 / 2
完整实现
public static Bitmap MakeCircleIcon(string text)
{
string bj = HttpContext.Current.Server.MapPath("~/App_Data/circle.png");
Bitmap oriImage = (Bitmap)Image.FromFile(bj); // 会锁定源文件
Bitmap memImage= new System.Drawing.Bitmap(oriImage);
oriImage .Dispose(); // 解锁源文件
// Graphics 上场
Graphics gh = Graphics.FromImage(bmpimg);
gh.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
gh.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
// 居中计算
var sizeF = gh.MeasureString(text, new Font("仿宋", 18, FontStyle.Bold));
float x = 24.0F - sizeF.Width / 2.0F;
float y = 11.0F;
// 实际绘制
Font drawFont = new Font("仿宋", 18, FontStyle.Bold);
SolidBrush drawBrush = new SolidBrush(Color.Green);// Create point for upper-left corner of drawing.
gh.DrawString(text, drawFont, drawBrush, x, y);
GC.Collect();
return memImage;
}