注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 微软开发专栏 > C#.NET 内容正文:C#处理数码相片之马赛克的实现

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

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

  马赛克算法很简单,说白了就是把一张图片分割成若干个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的整数倍:

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

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

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

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;
}
相关文章
  • C#操作xml文件入门
  • 用C#和ADO.NET建立一个数据绑定网格
  • Visual C# 诠释常用排序算法
  • 用C#通过网址得到域名
  • 用C#屏敝3721网络实名
【评论】【收藏本文】【打印】【关闭】
上一篇文章:用C#通过网址得到域名
下一篇文章:用C#和ADO.NET建立一个数据绑定网格
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
推荐阅讯
  • 利用Visual C#实现Windows管道技术
  • 在C#中建立复杂的、灵活的SQL查询/命令
  • 使用C#的反射机制时遇到的问题
  • 用C#创建PDA应用程序的柱形图控件
  • 在C语言中以编程的方式获取函数名
  • 使用C# 2.0泛型实现单例模式重用
  • 用C#实现HTTP协议下的多线程文件传输
  • 用C#和ADO.NET建立一个数据绑定网格
  • Visual C#实现HTTP代理服务程序
  • C#操作xml文件入门
阅读排行
  • 1.Visual C#组件技巧之深入ComboBox美容
  • 2.用C#实现HTTP协议下的多线程文件传输
  • 3.《C语言程序设计》教学的几点体会
  • 4.对C#中的TreeView添加背景图
  • 5.使用C#开发SmartPhone程序入门
  • 6.Visual C#中编写多线程程序之起步
  • 7.Visual C#实现HTTP代理服务程序
  • 8.用Visual C#打造多页面网页浏览器
  • 9.深入理解C#编程中的组件-事件-委托
  • 10.利用C#实现标注式消息提示窗口
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载