一段字符串中可能既有汉字又有字母,对于汉字和字母分别采用不同的字体进行绘制直接po代码了
Bitmap bmp = new Bitmap(iWidth, iHeight); Graphics g = Graphics.FromImage(bmp); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.FillRectangle(new SolidBrush(Color.FromArgb(0, 90, 169)), new Rectangle(0, 0, bmp.Width, bmp.Height)); if (IFYY) { Font arial = new System.Drawing.Font("Arial", 46F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); StringFormat test = StringFormat.GenericTypographic; SizeF size = g.MeasureString(strText, font, 1062, test); float fX = (1062 - size.Width) / 2 + 348; float fY = (58 - size.Height) / 2 + 960; float rowSpace = 0f; for (int i = 0; i < strText.Length; i++) { string ss = strText[i].ToString(); if (ISLetter(strText[i])) { SizeF sf = g.MeasureString(ss, arial); g.DrawString(ss, arial, brushWhite, fX, fY); if (ss == " ") { fX += g.MeasureString(ss, arial).Width + rowSpace; } else { fX += g.MeasureString(ss, arial, 100, test).Width + rowSpace; } //g.DrawString(strText[i].ToString(), arial, brushWhite, rectF, format); } else { g.DrawString(ss, font, brushWhite, fX, fY); fX += g.MeasureString(ss, font, 100, test).Width + rowSpace; } //fX += rowSpace; } } else { g.DrawString(strText, font, brushWhite, rectF, format); } //g.DrawString(strText, arial, brushWhite, rectF, format); g.Dispose(); bmp.RotateFlip(RotateFlipType.Rotate180FlipX); return bmp; } private static bool ISLetter(char c) { bool letter = false; if (c > 127) { letter = false; } else { letter = true; } return letter; }
需要注意的是:
StringFormat test = StringFormat.GenericTypographic; SizeF size = g.MeasureString(strText, font, 1062, test);
Graphics.MeasureString()方法,一定要使用如图的形式,否则测算出来的字母宽度不精确