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

在Bitmap上绘制Ellipse并返回带椭圆的Bitmap,下述代码是否合理?

代码问题诊断与修复方案

你的代码逻辑不可行,存在3个核心问题:

  • Graphics绑定的源Bitmap无引用导致失效:初始化ChipCanvas时传入的new Bitmap(60,60)没有被变量持有,GC回收后Graphics对象会变成无效状态,后续调用绘制方法会抛出GDI+相关异常。同时静态Graphics实例还存在多线程并发调用的安全风险。
  • 绘制内容未清空导致残留:因为Graphics是静态复用的,多次调用GetImage时,之前绘制的椭圆会一直残留在画布上,无法得到纯净的单椭圆图像。
  • 返回Bitmap的构造函数用法错误:new Bitmap(60, 60, ChipCanvas)这个构造函数的作用是用指定Graphics的DPI分辨率创建空白Bitmap,不会把Graphics里绘制的内容拷贝到新Bitmap里,你最后返回的始终是空白图像,根本拿不到绘制的椭圆。

正确实现代码

public override Bitmap GetImage()
{
    // 每次调用创建独立的Bitmap实例,避免资源冲突
    Bitmap bmp = new Bitmap(60, 60);
    // using语法会自动释放Graphics资源,避免GDI资源泄漏
    using (Graphics g = Graphics.FromImage(bmp))
    {
        // 可按需修改背景色,比如替换为Color.White等实体色
        g.Clear(Color.Transparent);
        Brush drawBrush = Color == PieceColors.Black ? Brushes.Black : Brushes.White;
        g.FillEllipse(drawBrush, 0, 0, 5, 5);
    }
    // 直接返回已经完成绘制的Bitmap即可
    return bmp;
}

如果相同样式的图像需要频繁调用,可以缓存生成好的Bitmap实例,不要缓存Graphics对象来复用。

内容的提问来源于stack exchange,提问作者georgebreje

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:03:04