在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
相关产品推荐
相关产品推荐

