C# PictureBox中绘制的圆形边缘被截断问题求助
解决圆形头像边缘截断问题
你的问题出在GDI+绘制椭圆时的线条对齐机制:默认Pen宽度为1像素,绘制时线条会以矩形边界为中心向内外各延伸0.5像素,而你的Bitmap尺寸刚好是70x70,导致超出Bitmap范围的边缘被裁剪,出现截断。同时代码存在未释放GDI资源的问题,一并修正:
修改后的代码
public MemoryStream GenerateCircle(string name) { var avatarString = name[0].ToString().ToUpper(); var bgColour = ColorTranslator.FromHtml("#007FBC"); // 用using包裹所有实现IDisposable的对象,避免内存泄漏 using (var bmp = new Bitmap(70, 70)) using (var sf = new StringFormat()) using (var font = new Font("Arial", 34, FontStyle.Bold, GraphicsUnit.Pixel)) using (var graphics = Graphics.FromImage(bmp)) using (var b = new SolidBrush(bgColour)) using (var pen = new Pen(bgColour)) { sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; graphics.Clear(Color.White); graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; // 调整矩形向内收缩1像素,让椭圆完全在Bitmap内部 Rectangle rect = new Rectangle(1, 1, 68, 68); graphics.FillEllipse(b, rect); graphics.DrawEllipse(pen, rect); // 先填充再绘制,避免边框被填充色覆盖 graphics.DrawString(avatarString, font, new SolidBrush(Color.WhiteSmoke), 35, 35, sf); graphics.Flush(); var ms = new MemoryStream(); bmp.Save(ms, ImageFormat.Png); ms.Position = 0; // 重置流位置,确保后续读取正常 return ms; } }
关键修改点说明
- 调整绘制矩形:将
Rectangle(0, 0, 70, 70)改为Rectangle(1, 1, 68, 68),给Pen的绘制留出足够空间,避免边缘超出Bitmap被裁剪。 - 资源释放:用
using语句包裹所有实现IDisposable的对象(Bitmap、Font、Graphics等),防止GDI资源泄漏。 - 绘制顺序优化:先填充椭圆再绘制边框,避免边框被填充色覆盖。
- 重置流位置:保存Bitmap后将MemoryStream的Position设为0,确保PictureBox读取流时从开头开始。
额外建议
如果你的PictureBox尺寸和70x70差异较大,建议:
- 生成更大尺寸的Bitmap(比如140x140),再按比例缩小显示,提升清晰度;
- 确保PictureBox的
SizeMode设为Zoom时,控件本身的尺寸不要小于Bitmap的最小边,避免缩放时边缘被裁切。
内容的提问来源于stack exchange,提问作者Developer1992
相关产品推荐
相关产品推荐

