You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:20:36