使用FSharp 探索Dotnet图像处理功能1--反色变化
2018-06-27 09:55:03来源:未知 阅读 ()
坚持写博客是最近的目标。加油。
业余学习fsharp以来一直觉得这才是Dotnet开发,或者说所有开发者应该拥有的语言。配合Visual Studio的代码提示,即时执行窗口。开发程序有着极大的乐趣。
最近想学习一些图像处理的相关知识。试着把Fsharp又捡了起来。边学边玩,希望两个方面都有所进益。
图像的处理首先要解决显示的问题。在FSI中内嵌了Winform的消息处理,可以很方便的几句话画出一个带PictureBox的窗体。在FSI中由于可以保持对窗体和控件的控制权,当更新算法后,我们可以很快的看到结果。拥有即时反馈的编程工具真是开发人员的幸运。
open System.Windows.Forms let form = new Form() let image = new PictureBox(Dock = DockStyle.Fill) form.Controls.Add(image) image.SizeMode <- PictureBoxSizeMode.StretchImage form.Show()
显示窗体的代码如上所示,非常的简单。当然此时什么都没有。下面来加载一张图片
open System.Drawing let image_path = __SOURCE_DIRECTORY__ + @"\Chrysanthemum.jpg" let bitmap = new Bitmap(image_path) image.Image <- bitmap
好了最基本的框架完成了。此时我们仍可以通过bitmap,image等变量控制窗口的显示。
最后是反色程序,首先我们取出所有像素点
let Pixels =seq {for h in 0..bitmap.Height-1 do for w in 0..bitmap.Width-1 do yield bitmap.GetPixel(w, h)}
进行反色操作
Pixels |> Seq.iteri(fun i c -> bitmap.SetPixel(i%bitmap.Width, i/bitmap.Width, Color.FromArgb((255 - (int c.R)), (255 - (int c.G)), (255 - (int c.B))))) //win10 seem to need to update manually image.Invalidate()
很简单吧。就是速度哦有些慢。主要是SetPixel和GetPixel操作拖累了速度。
使用BitmapData可以大大加快速度。使用#time 操作打开操作时间显示看看快了多少
let imagerect = new Rectangle(0,0,bitmap.Width, bitmap.Height) let bitmapdata = bitmap.LockBits(imagerect, ImageLockMode.ReadWrite, bitmap.PixelFormat) let buffer:byte[] = Array.zeroCreate (bitmap.Width * bitmap.Height * Bitmap.GetPixelFormatSize(bitmap.PixelFormat)/8) Marshal.Copy(bitmapdata.Scan0, buffer, 0, buffer.Length) let newbuff = buffer |> Seq.map(fun x -> 255uy - x) |> Array.ofSeq Marshal.Copy(newbuff, 0, bitmapdata.Scan0, buffer.Length) bitmap.UnlockBits(bitmapdata) image.Invalidate()
Real: 00:00:01.227,CPU: 00:00:01.218,GC gen0: 0, gen1: 0, gen2: 0 Real: 00:00:00.050,CPU: 00:00:00.046,GC gen0: 0, gen1: 0, gen2: 0
下次再找个知识点,不过似乎要先补补微积分和线代了。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:C#学习笔记-接口与抽象类
下一篇:Linux登录那点事
- C++ 在名称空间中使用using声明和using编译指令 2020-05-29
- 1.ffmpeg、ffplay、ffprobe命令使用 2020-05-11
- 关于使用ffmpeg的一些牢骚 2020-05-08
- G++编译链接的那些事!G++的特殊使用方法[常用] 2020-04-19
- c/c++ 使用valgrind检查内存泄漏 2020-04-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash