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

如何使用GDI实现图像描边效果 支持自定义粗细颜色,适配WinForms的C#/VB.NET开发

GDI+ 图像描边实现方案

完全可以基于WinForms平台的GDI+实现你需要的图像描边效果,支持自定义描边粗细、颜色,无需引入第三方依赖,以下是C#版本的实现:

核心实现代码

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public static class ImageOutlineHelper
{
    /// <summary>
    /// 给带透明背景的图像添加外描边
    /// </summary>
    /// <param name="originalImage">原图(要求带透明通道)</param>
    /// <param name="outlineColor">描边颜色</param>
    /// <param name="outlineWidth">描边粗细(单位:像素)</param>
    /// <returns>添加描边后的图像</returns>
    public static Bitmap AddOutline(Bitmap originalImage, Color outlineColor, float outlineWidth)
    {
        if (originalImage == null) throw new ArgumentNullException(nameof(originalImage));
        
        // 创建和原图尺寸一致的透明画布
        var result = new Bitmap(originalImage.Width, originalImage.Height, PixelFormat.Format32bppArgb);
        using (var g = Graphics.FromImage(result))
        {
            g.Clear(Color.Transparent);
            // 开启抗锯齿提升描边平滑度
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.PixelOffsetMode = PixelOffsetMode.Half;

            // 提取原图非透明区域的轮廓路径
            var outlinePath = new GraphicsPath();
            // 逐像素扫描非透明区域,小图场景下性能足够,大尺寸图像可替换为LockBits批量读取优化
            for (int y = 0; y < originalImage.Height; y++)
            {
                for (int x = 0; x < originalImage.Width; x++)
                {
                    if (originalImage.GetPixel(x, y).A > 10) // 过滤半透明噪点
                    {
                        outlinePath.AddRectangle(new Rectangle(x, y, 1, 1));
                    }
                }
            }

            // 绘制描边
            using (var outlinePen = new Pen(outlineColor, outlineWidth))
            {
                outlinePen.LineJoin = LineJoin.Round;
                outlinePen.StartCap = LineCap.Round;
                outlinePen.EndCap = LineCap.Round;
                g.DrawPath(outlinePen, outlinePath);
            }

            // 叠加原图到最上层
            g.DrawImage(originalImage, Point.Empty);
        }
        return result;
    }
}

调用示例

// 读取原图
var originalImg = new Bitmap(@"本地原图路径.png");
// 生成3像素宽度的红色描边图像
var outlinedImg = ImageOutlineHelper.AddOutline(originalImg, Color.Red, 3f);
// 绑定到WinForms控件显示
pictureBox1.Image = outlinedImg;

说明

  • 该实现适配透明背景图案描边场景,输出效果和你示例的描边效果一致
  • 若需要VB.NET版本,只需将上述C#语法转换为VB.NET语法即可,核心GDI+ API调用逻辑完全相同
  • 处理大尺寸图像时,可以将逐像素GetPixel的逻辑替换为LockBits批量读取像素数据的方式,性能可提升10倍以上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:36:01