技术初心程序园

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;
}
上一篇下一篇

猜你喜欢

热点阅读