图片的处理搞过好多,最近遇到一个图片圆角处理问题,初步想有两种实现方式:
1、把方形图片的四角用一定的算法裁剪掉;
2、先绘制一个圆角矩形,再把图片填充进来。
今天想了一会,第一个方法没实现,用第二种比较简单,大概思路如下:
1、先创建一个与图片大小相同的画布;
2、计算圆角矩形路径,实际上就是计算圆角矩形“每条边”的路径;
3、用原始图片填充圆角矩形。
/// <summary>
/// 圆角修复。
/// </summary>
/// <param name="radius">圆角半径。</param>
/// <returns>true 表示修复成功,false 修改失败。</returns>
public bool Fillet(int radius)
{
if (radius <= 0 || radius > this.size.Width / 2 || radius > this.size.Height / 2)
return false;
//创建一张空白的画布
Bitmap map = new Bitmap(this.size.Width, this.size.Height, PixelFormat.Format32bppArgb);
//创建Graphics实例
Graphics graphics = Graphics.FromImage(map);
graphics.InterpolationMode = InterpolationMode.High;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.FillRectangle(Brushes.Transparent, 0, 0, this.size.Width, this.size.Height);
//定义直径
int diameter = radius * 2;
GraphicsPath path = new GraphicsPath();
path.AddLine(new Point(radius, 0), new Point(this.size.Width - radius, 0));//这里的this.size,是当前画布大小,也是原始的图片大小。
path.AddArc(new Rectangle(this.size.Width - diameter, 0, diameter, diameter), 270, 90);
path.AddLine(new Point(this.size.Width, radius), new Point(this.size.Width, this.size.Height - radius));
path.AddArc(new Rectangle(this.size.Width - diameter, this.size.Height - diameter, diameter, diameter), 0, 90);
path.AddLine(new Point(this.size.Width - radius, this.size.Height), new Point(radius, this.size.Height));
path.AddArc(new Rectangle(0, this.size.Height - diameter, diameter, diameter), 90, 90);
path.AddLine(new Point(0, this.size.Height - radius), new Point(0, radius));
path.AddArc(new Rectangle(0, 0, diameter, diameter), 180, 90);
TextureBrush brush = new TextureBrush(this.bitmap);//这里的this.bitmap,是原始图片
graphics.FillPath(brush, path);
//保存处理后的图像
this.bitmap = map;
graphics.Dispose();
return true;
}
效果如下(四角透明):
