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

FloodFill填充算法使用DrawRectangle时像素颜色异常问题排查

问题诱因

该问题的核心原因是DrawRectangle的绘制行为不符合单像素着色的预期,意外污染了相邻像素:

  • GDI+ 中 DrawRectangle 是边框绘制方法,而非单像素填充方法。当你传入坐标(i,j)、宽高均为1的参数,使用默认1像素宽度的Pen绘制时,实际会覆盖不止(i,j)一个像素:
    • 默认Pen的对齐方式为PenAlignment.Center,笔触会沿绘制路径的中线向两侧扩展。对于1像素宽的笔、1x1大小的矩形路径来说,笔触会向路径外侧(右侧、下侧)溢出半个像素,最终渲染时会同时覆盖(i,j)、(i+1,j)、(i,j+1)多个相邻像素。
    • 这就导致你每次为(i,j)点着色时,已经提前把右侧(i+1,j)和下方(i,j+1)的像素修改为了目标红色,后续递归到这两个坐标时,c != curColorARGB的判断条件不成立,直接跳过填充逻辑,最终出现只有左上侧区域可以正常填充、右下侧区域无法填充的现象。

替换SetPixel后正常的原因

SetPixel(i,j,color)是Bitmap提供的原生单像素操作方法,只会直接修改坐标(i,j)对应的单个像素,不会触碰任何其他相邻像素,递归判断逻辑完全符合泛洪填充的预期,因此功能正常。

优化建议

如果需要保留基于Graphics的绘制逻辑,可以将DrawRectangle替换为FillRectangle,直接填充1x1的纯色区域,即可实现和SetPixel一致的单像素着色效果:

using (Graphics g = Graphics.FromImage(bmp))
    g.FillRectangle(new SolidBrush(color), i, j, 1, 1);

内容的提问来源于stack exchange,提问作者Sun of A beach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:36:05