给图像马赛克处理的程序c语言,C#中的图像处理(附带生成马赛克范例)

很多图片处理的算法从原理上讲其实非常简单,难点往往在如何去写算法实现它,更加难的就是如何去优化实现的算法。

马赛克算法很简单,说白了就是把一张图片分割成若干个val * val像素的小区块(可能在边缘有零星的小块,但不影响整体算法),每个小区块的颜色都是相同的。为了方便起见,我们不妨让这个颜色就用该区域最左上角的那个点的颜色。当然还可以有其他方法,比如取区块中间点的颜色,或区块中随机点的颜色作代表等等。

下面的示意图就是取val=2的结果。

原图像素

ABCDEFG

HIJKLMN

OPQRSTU

VWXYZ01

2345678

马赛克处理后

AACCEEG

AACCEEG

OOQQSSU

OOQQSSU

2244668

public static Bitmap KiMosaic(Bitmap b, int val)

{

if (b.Equals(null))

{

return null;

}

int w = b.Width;

int h = b.Height;

int stdR, stdG, stdB;

stdR = 0;

stdG = 0;

stdB = 0;

BitmapData srcData = b.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

unsafe

{

byte* p = (byte*)srcData.Scan0.ToPointer();

for (int y = 0; y < h; y++)

{

for (int x = 0; x < w; x++)

{

if (y % val == 0)

{

if (x % val == 0)

{

stdR = p[2]; stdG = p[1]; stdB = p[0];

}

else

{

p[0] = (byte)stdB;

p[1] = (byte)stdG;

p[2] = (byte)stdR;

}

}

else

{

// 复制上一行

byte * pTemp = p - srcData.Stride;

p[0] = (byte)pTemp[0];

p[1] = (byte)pTemp[1];

p[2] = (byte)pTemp[2];

}

p += 3;

} // end of x

p += srcData.Stride - w * 3;

} // end of y

b.UnlockBits(srcData);

}

return b;

}

先上原图:

0818b9ca8b590ca3270a3433284dd417.png

再上效果图

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值