坚持写博客是最近的目标。加油。

业余学习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 ..bitmap.Height- do
for w in ..bitmap.Width- do
yield bitmap.GetPixel(w, h)}

进行反色操作

Pixels |> Seq.iteri(fun i c ->
bitmap.SetPixel(i%bitmap.Width,
i/bitmap.Width,
Color.FromArgb(( - (int c.R)), ( - (int c.G)), ( - (int c.B)))))
//win10 seem to need to update manually
image.Invalidate()

很简单吧。就是速度哦有些慢。主要是SetPixel和GetPixel操作拖累了速度。

使用BitmapData可以大大加快速度。使用#time 操作打开操作时间显示看看快了多少

let imagerect = new Rectangle(,,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)/)
Marshal.Copy(bitmapdata.Scan0, buffer, , buffer.Length)
let newbuff = buffer |> Seq.map(fun x -> 255uy - x) |> Array.ofSeq
Marshal.Copy(newbuff, , bitmapdata.Scan0, buffer.Length)
bitmap.UnlockBits(bitmapdata) image.Invalidate()
Real: ::01.227,CPU: ::01.218,GC gen0: , gen1: , gen2: 

Real: ::00.050,CPU: ::00.046,GC gen0: , gen1: , gen2: 

下次再找个知识点,不过似乎要先补补微积分和线代了。

使用FSharp 探索Dotnet图像处理功能1--反色变化的更多相关文章

  1. 使用FSharp 探索Dotnet图像处理功能2--均衡灰度

    重新捡起大学里的图像处理,好像之前什么都没学到,但是我为什么还留着这本书呢?嘿嘿. 看到均衡灰度处理,上来就是积分,概率分布的公式,头微微的有点疼.网上看了点介绍,隔天再拿起书本,总算有了点眉目.简而 ...

  2. 使用Fsharp 探索 Dotnet 平台

    Fsharp的交互开发环境使得我们在了解DotNet平台时能够快速的获得需要的反馈. 反馈在任何技艺的磨练过程中必不可少,我认为也是最重要的环节之一.在“一万小时天才理论”中,著名的髓鞘质就是在快速有 ...

  3. 批量生成反色图片,用PHOTOSHOP批处理功能。

    http://zhidao.baidu.com/link?url=Iz46PDPnEITummTEwo2GtUrK6AeAjlidJ7HtCPJ6NYZJbbllRwNg2iBAcNwF2TYjccP ...

  4. php图像处理(thinkphp框架有相对强大的图像处理功能)

    php图像处理(thinkphp框架有相对强大的图像处理功能) 一.总结 1.php处理图像:php处理图像需要安装外库(gd库) 2.gd库函数可以非常完美的操作图像:安装好库之后,这个库里面的函数 ...

  5. Win8Metro(C#)数字图像处理--2.3图像反色

    原文:Win8Metro(C#)数字图像处理--2.3图像反色 [函数名称] 图像反色函数ContraryProcess(WriteableBitmap src) [算法说明]     反色公式如下: ...

  6. Java 从零开始实现一个画图板、以及图像处理功能,代码可复现

    Java 从零开始实现一个画图板.以及图像处理功能,代码可复现 这是一个学习分享博客,带你从零开始实现一个画图板.图像处理的小项目,为了降低阅读难度,本博客将画图板的一步步迭代优化过程展示给读者,篇幅 ...

  7. php对图片反色处理

    今天有个需求用php对图片进行反色,和转灰,之前不知道可不可行,后来看到了imagefilter()函数,用来转灰绰绰有余,好强大: imagefilter($im, IMG_FILTER_GRAYS ...

  8. [js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)

    接着上文[js高手之路] html5 canvas系列教程 - 状态详解(save与restore),相信大家都应该玩过美颜功能,而我们今天要讲的就是canvas强大的像素处理能力,通过像素处理,实现 ...

  9. html、canvas、视频灰度、反色

    效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

随机推荐

  1. 前端跨域方案-跨域请求代理(node服务)

    前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...

  2. wpf的无边框窗体透明

    本人做了3年的winform,来了新的工作,需要使用wpf.对于wpf,本人小白一个.说的不对的地方,请大家多多指导.... 今天先从wpf的窗体属性开始说起! 需要做的项目功能大概和电脑桌面类似,需 ...

  3. Linux 命令--查看物理CPU个数、核数、逻辑CPU个数

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  4. MyBatis从入门到放弃四:一对多关联查询

    前言 上篇学习了一对一关联查询,这篇我们学习一对多关联查询.一对多关联查询关键点则依然是配置resultMap,在resultMap中配置collection属性,别忽略了ofType属性. 搭建开发 ...

  5. Servlet探秘

    学习servlet,最重要的就是理解servlet下面四个点:        1.了解Servlet API的常用接口和类 2.掌握Servlet的生命周期 3.掌握Servlet的部署和配置 4.会 ...

  6. extundelete教程(完整版)

    作者:蒋张裕 Extundelete是在Linux下,基于开源的数据恢复工具.使用阿里云的云服务器 ECS,您可以方便地安装,及时还原误删除的重要文件. extundelete不仅能够通过在文件系统的 ...

  7. Java对象序列化的使用和定制

    序列化的概念及使用场合 序列化就是把对象转化为字节序列并持久化保存,可以保存在内存中.磁盘文件系统,甚至通过网络传递,并能够在以后将这个字节序列完全恢复为原来的对象. 对象序列化的概念引入Java是为 ...

  8. APP H5 混合自动化使用说明 [基于 Appium+Python 系列]

    背景 前几天接到H5开发人员那边的业务开发需求单,说想将H5接入到自动化系列中,特此记录分享一下. 环境前置准备 手机与电脑USB连接,开启USB调试模式,通过adb devices可查看到此设备. ...

  9. js对象继承的问题

    js继承方法有多种: 1.利用call()和apply()的方法. call()里面接受多个参数:apply()只能接受两个参数. call()第一个参数是本身,后面都是他的属性和方法. apply( ...

  10. Objective-c日记-之属性列表

    属性列表 1,概述 在Cocoa中,有一类名为属性列表的对象(常简写为plist),Cocoa知道如何将它们保存到文件和从文件中加载.包括以下类NSArray,NSDictionary,NSStrin ...