
本来需求需要处理一个类似泛光的效果,对于亮色区域进行膨胀,但是处理失误,导致出现了上面这样的持续偏离,并且边缘拖尾的效果。但是感觉这个效果还挺漂亮的,所以把它记录下来。实现的代码如下:
private void button13_Click_do()
{
try
{
if (rec_1_going) return;
rec_1_going = true;
var img = pictureBox1.Image.Clone() as Bitmap;
var circlelen = 1;
var ps_incircle = new Point().RoundPsN(circlelen);
var circlelenMax = circlelen + 1;
var margin = 1;
var img_mask = new Bitmap(img.Width, img.Height);
var lb_mask = new LockBitmap(img_mask);
lb_mask.LockBits();
var lb = new LockBitmap(img);
lb.LockBits();
Color[,] rst = new Color[lb.Width, lb.Height];
bool[,] doneset = new bool[lb.Width, lb.Height];
for (int r = margin; r < img.Height - margin; r++)
{
for (int c = margin; c < img.Width - margin; c++)
{
if (doneset[c, r]) continue;
var cr_curr = lb.GetPixel(c, r);
var ls = ps_incircle.Select(a => new Point(a.X + c, a.Y + r)).ToList();
foreach (var p in ls)
{
var dist = ImgHelper.PointDist(p, new Point(c, r));
var dist_pct = dist / (double)circlelenMax;
var a = 255 - (int)Math.Max(0, Math.Min(255, 255 * dist_pct));
lb_mask.SetPixel(p.X, p.Y, Color.FromArgb(a, cr_curr));
}
}
}
lb.UnlockBits();
lb_mask.UnlockBits();
var imgnew = new Bitmap(img.Width, img.Height);
var g_new = System.Drawing.Graphics.FromImage(imgnew);
g_new.DrawImage(img, new Point());
g_new.DrawImage(img_mask, new Point());
g_new.Dispose();
img_mask.Dispose();
img.Dispose();
pictureBox1.Image = imgnew; pictureBox2.Image = imgnew;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
rec_1_going = false;
}
}
很多意外的美好,可能都是在错误的意外中遇见的吧。
希望你的每一次失误,都遇见美好。
674

被折叠的 条评论
为什么被折叠?



