如何用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,提问作者Анатолий П
相关产品推荐
相关产品推荐

