![]() |
首页 | asp.net | HTML教程 | C#教程 | SQLSever | CSS教程 | javascript | 软件开发 | 项目管理 |
|
|
C#处理数码相片之马赛克的实现 程序开发
来源:csai 作者:sortol.com 发布时间:
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的整数倍: 很简单,直接复制上一行。 简单的说就是以线带面,最终实现让大家都看不清楚 下面就是源代码。写算法不是我的强项,不过偶尔勉为其难的写个可以跑跑的不求甚解版还是可以做到的,不指望可以帮到你,只希望没有误导你。 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#和Visual Basic中的闭包与对象生存时期 程序开发 C#处理数码相片之马赛克的实现 程序开发 论C#变得越来越臃肿是不可避免的 程序开发 C#数据库操作的3种典型用法 程序开发 C#动态生成树型结构的Web程序设计[1] 程序开发 利用C#远程存取Access数据库[1] 程序开发 独家:C#数据库操作的三种经典用法 程序开发 正确理解C#中的ref关键字 程序开发 分部方法:应该纳入到C#中吗? 程序开发 NET委托:一个关于C#的睡前故事[1] 程序开发 C#开发里List控件的使用方法介绍 程序开发 用C#开发智能手机软件:推箱子 程序开发 C# 你提问我回答![1] 程序开发 C# 中可空类型的魅力[1] 程序开发 Visual C#通用模块开发:后台管理员模块[1] 程序开发 Visual C#通用模块开发:DataGrid控件[1] 程序开发 C#面向对象分析[1] - C#面向对象分析 软件工程 C#高级编程:数据库连接[1] 程序开发 C#高级编程:事务处理和命令 程序开发 浅析Java与C#的事件处理机制(二) 程序开发最新信息
技术评审方法与指南 嵌入式操作系统Nucleus下触摸屏驱动的开发 嵌入式数据库SQLite在电梯B/S监控中的应用 如何安装使用IBM Rational RequisiteWeb 通过自动化工具的实施提高你的CMM水平 ASP.NET系统用户权限设计与实现 项目集成计划 软件项目常见风险及其预防措施 配置管理变更的关键路径 UML 对象模型图阅读指南 UML 2.0修成正果 “适用性”是最重要的需求 SaaS将成中小企业信息化趋势 层次分析法(AHP) WF 表决的例子 流程发送动作 企业架构观点:什么最适合您的组织? 从城市建设看SOA 企业信息化规划调研问卷 最先进的技术:Windows Workflow Foundation 软件系统设计层次与内容 从瀑布模型、极限编程到敏捷开发 嵌入式系统中入侵检测的设计与实现 CMMI四级量化项目管理QPM-特定目标SG1 故障树分析法 项目管理 信息系统监理为什么要做好变更控制? 软件工程-软件目的需求开发与管理 测试驱动需求分析--需求文档评审实例 体系结构实践,第 1 部分: 理解面向服务的体系结构推荐资讯
|