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

如何用MagickImage(C#)实现256x256图片的圆形渐变透明效果?

解决Magick.NET制作径向渐变透明度图片的中心十字问题

需求是制作256x256的图片,实现径向渐变透明度效果:中心位置透明度0%(完全不透明),距离中心128像素及更远的区域透明度100%(完全透明)。

此前尝试了两种Magick.NET实现代码,但结果均出现中心十字异常,代码如下:

MagickImage image2 = new MagickImage("2.jpg");

image2.Format = MagickFormat.Png;
image2.Alpha(AlphaOption.Set);
MagickImage copy = new MagickImage(image2.Clone());
copy.BackgroundColor = MagickColors.None;
copy.Vignette(64, 64, 64, 64);
image2.Composite(copy, CompositeOperator.CopyAlpha);
copy.Write("3.jpg");
MagickImage image = new MagickImage("2.jpg");
image.Alpha(AlphaOption.Set);
image.VirtualPixelMethod = VirtualPixelMethod.Transparent;
image.Blur(0, 128, Channels.Alpha);
image.Level(new Percentage(50), new Percentage(100), Channels.Alpha);
image.Write("soft_edge.png");

简便解决方案

直接绘制径向渐变蒙版并将其作为Alpha通道应用到原图,可彻底避免中心十字问题,代码简洁且效果精准:

using (var original = new MagickImage("2.jpg"))
{
    // 确保原图尺寸为256x256
    original.Resize(256, 256);
    original.Alpha(AlphaOption.Set);

    // 创建径向渐变蒙版:中心白色(对应Alpha=255,完全不透明),半径128px处过渡到黑色(对应Alpha=0,完全透明)
    using (var alphaMask = new MagickImage(MagickColors.Black, 256, 256))
    {
        using (var drawables = new Drawables())
        {
            var radialGradient = new RadialGradient(128, 128, 0, 128, 128, 128);
            radialGradient.AddColorStop(0, MagickColors.White);
            radialGradient.AddColorStop(1, MagickColors.Black);
            drawables.FillGradient(radialGradient);
            drawables.Rectangle(0, 0, 255, 255);
            drawables.Draw(alphaMask);
        }

        // 将蒙版的灰度值映射为原图的Alpha通道
        original.Composite(alphaMask, CompositeOperator.CopyAlpha);
        original.Write("final_result.png");
    }
}

原理说明

之前的Vignette和Blur方法因算法采样逻辑,在中心区域易出现异常十字。而直接绘制径向渐变蒙版的方式,能精准控制从中心到边缘的透明度过渡范围,完全规避这类采样问题,同时实现需求的渐变效果。

内容的提问来源于stack exchange,提问作者Анатолий П

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:30:41