中成网站建设
    成都做网站,就选中成网站建设!专业四川网站建设,成都网站建设服务提供商
            企业宣传网站建设、电子商务网站建设、OA办公系统。联系电话:028-66165255
    资讯列表  
 ASP.NET防止用户多次登录的方法…
 生成不重复的随机整数
 ASP.NET获取IP的6种方法
 ASP dot net 里的状态管理-Ses…
 判断获取的参数是否为null
 中文验证码生成实例
 微软发布第二个实验版的.Net 4…
 微软轻量级Web开发平台WebMatr…
 asp.net 生成图片验证码
 Asp.net直接保存文件到客户端
 .Net开发中的多线程编程总结
 C#中关于get和set的详细例子介…
 ASP.NET编程技巧:提高asp.net…
 asp.net 剪切 缩小图片原码
 截断过长字符串为省略号算法
    资讯详情  
实现C#马赛克算法
发布时间:2009-08-17                  来源:成都网站建设--中成网建         【加入收藏】

应听众点播要求,今天讲讲C#马赛克算法的实现。老规矩,不求甚解,只许看不许问为什么

很多图片处理的算法从原理上讲其实非常简单,难点往往在如何去写算法实现它,更加难的就是如何去优化实现的算法。虽说我一向认为程序员的效率比程序的效率更重要,但为了等处理一张自己拍摄的数码照片,溜出去买杯奶茶顺便再买张彩票回来发现还没算好,无论如何都是不能忍受的。

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

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

原图像素
ABCDEFG
HIJKLMN  
OPQRSTU  
VWXYZ01  
2345678  

马赛克处理后
AACCEEG
AACCEEG
OOQQSSU
OOQQSSU
2244668

原理就是那么简单。具体实现就看各人的思维习惯了。我的想法是:

当y(当前高度)是val的整数倍时:
扫描当前行中的每一点x,如果x也是val的整数倍,记录下当前x,y的颜色值;如果x不是val的整数倍,则沿用最近一次被记录的颜色值。
当y不是val的整数倍:
很简单,直接复制上一行。

简单的说就是以线带面,最终实现让大家都看不清楚

下面就是源代码。写算法不是我的强项,不过偶尔勉为其难的写个可以跑跑的不求甚解版还是可以做到的,不指望可以帮到你,只希望没有误导你。

  1. publicstaticBitmapKiMosaic(Bitmapb,intval)  
  2. {  
  3. if(b.Equals(null))  
  4. {  
  5. returnnull;  
  6. }  
  7. intw=b.Width;  
  8. inth=b.Height;  
  9. intstdR,stdG,stdB;  
  10. stdR=0;  
  11. stdG=0;  
  12. stdB=0;  
  13. BitmapDatasrcData=b.LockBits(newRectangle(0,0,w,h),
    ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);  
  14. unsafe  
  15. {  
  16. byte*p=(byte*)srcData.Scan0.ToPointer();  
  17. for(inty=0;y<h;y++)  
  18. {  
  19. for(intx=0;x<w;x++)  
  20. {  
  21. if(y%val==0)  
  22. {  
  23. if(x%val==0)  
  24. {  
  25. stdR=p[2];stdG=p[1];stdB=p[0];  
  26. }  
  27. else  
  28. {  
  29. p[0]=(byte)stdB;  
  30. p[1]=(byte)stdG;  
  31. p[2]=(byte)stdR;  
  32. }  
  33. }  
  34. else  
  35. {  
  36. //复制上一行  
  37. byte*ppTemp=p-srcData.Stride;  
  38. p[0]=(byte)pTemp[0];  
  39. p[1]=(byte)pTemp[1];  
  40. p[2]=(byte)pTemp[2];  
  41. }  
  42. p+=3;  
  43. }//endofx  
  44. p+=srcData.Stride-w*3;  
  45. }//endofy  
  46. b.UnlockBits(srcData);  
  47. }  
  48. returnb;  

以上介绍C#马赛克算法

 

 
上一篇:Gmail成美国第三大邮件服务商 雅虎仍居榜首
下一篇:Python和Ruby:流行动态脚本语言之特点对比
【打印】    【关闭】    【字体变小】    【字体变大】

友情链接

首页  |  建站学院  |  网站建设  |  成功案例  |  业务体系  |  软件定制  |  解决方案  |  联系我们  |  免责声明
中成网建公司地址:四川省成都市双楠双安东巷1号18-3-5 电话:028-6616 5255 版权所有 @ 中成网建
成都网站建设网址:www.csccd.net www.csccd.cn 邮箱:web#csccd.net
信息产业部备案号:蜀ICP备08106559号