C#处理数码相片之马赛克的实现

C#处理数码相片之马赛克的实现,第1张

C#处理数码相片之马赛克的实现,第2张

很多图像处理算法其实原理都很简单。难点在于如何写一个算法来实现,更难的是如何优化算法。虽然我一直认为程序员的效率比程序的效率更重要,但是为了等一张自己拍的数码照片处理好,我溜出去买了杯奶茶,回来买了张彩票,才发现不够好。无论如何,我受不了了。

镶嵌算法很简单。说白了就是把一张图片分成val * val像素的若干块(边缘可能会有零星的块,但不会影响整个算法)。每块的颜色都是一样的。为了方便起见,我们不妨使用该区域左上角的颜色。当然还有其他的方法,比如以块的中间点的颜色,或者块中随机点的颜色为代表等等。

下图是取val=2的结果。

马赛克处理后的原始像素
abcdefg
hijklmn
opqrstu
vwxyz 01
2345678
AAC CEEG[/br

原理就是这么简单。实现取决于每个人的思维习惯。我的想法是:

当y(当前高度)是val的整数倍时:

扫描当前行中的每个点x,如果x也是val的整数倍,记录当前x和y的颜色值;如果x不是val的整数倍,则使用最后记录的颜色值。
当y不是val的整数倍时:

很简单。直接复制上一行。

简单来说就是以面带线,最后实现会让大家看不清楚。

下面是源代码。编写算法不是我的强项,但偶尔我可以通过编写一个不需要太多解决方案就可以运行的版本来完成。我不指望能帮到你,只希望不误导你。

公共静态位图KiMosaic(Bitmap b,int val)
{
if(b . Equals(null))
{
返回null;
}
int w = b . Width;
int h = b . Height;
int stdR,stdG,stdB
stdR = 0;
stdG = 0;
stdB = 0;
BitmapData srcData = b . lock bits(new Rectangle(0,0,w,h),ImageLockMode。读写,像素格式。format 24 bpprgb);
unsafe
{
byte * p =(byte *)srcData。scan 0 . 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] =(字节)stdG
p[2] =(字节)stdR
}
}
else
{
/复制上一行
byte * ptemp = p-srcdata . stride;
p[0]=(byte)pTemp[0];
p[1]=(byte)pTemp[1];
p[2]=(byte)pTemp[2];
}
p+= 3;
}//x的结尾
p += srcData。stride-w * 3;
}//y的结尾
b . unlock bits(srcData);
}
return b;
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#处理数码相片之马赛克的实现

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情