早期的时候我使用的开发工具是VB6,VB6做图像处理的速度在我的软件Imageshop中有所体现,还是算可以的。目前,我已经改用C#来研究图像算法,C#中有指针,做图像处理起来效率确实要高不少。VB.NET当初也用过不到半年的时间,在http://blog.csdn.net/laviewpbt/article/details/752003一文中我曾经对VB.NET图像处理做了简单的总结。今天就我掌握的情况,在对VB.NET的图像处理做一个简单的描述。

首先,还是谈谈图像像素时数据获取方面吧,.net中的图像相关类基本上都是基于GDI+的,因此,图像数据的获取其实也是调用GDI+的一些函数。这个函数就是LockBits,在vb.net中彩色图像数据的快速获取 一文中,我们是调用了Marshal.Copy把LockBits锁定的内存数据拷贝到数据中,然后对数组中的值进行处理。这样做主要的原因是VB.NET不好直接访问内存(Marshal.ReadByte之类的函数不适合用于大型的循环中)。那么,这就造成了2个不好的事情,第一:在同一时间需要2倍于图像数据量的内存,第二:内存数据拷贝到数据,以及处理后再把数组的数据拷贝会内存中都是会减低速度的。作为一种改进,我们应该充分利用LockBits的功能。LockBits中的LockMode中有一种模式为ImageLockMode.UserInputBuffer,该模式下需要用户先申请内存,然后在把图像数据按照相关格式填充如这个内存中。这样,就可以先定义个数组,然后把图像数据填充到这个数组中,就避免了来回拷贝的耗时了,简单示例代码如下:

  Dim BmpData As New BitmapData
Stride = ((Bmp.Width * 3 + 3) And &HFFFFFFFC)
Dim PixleValue(Stride * Bmp.Height) As Byte
Dim Hanlde As GCHandle = GCHandle.Alloc(PixleValue, GCHandleType.Pinned)
BmpData.Scan0 = Hanlde.AddrOfPinnedObject() '取得字节数组的的第一个元素在内存中的地址,VB.NET没有了VB6.0的VarPtr函数了
BmpData.Stride = Stride 'Stide这一个字段也必须实现填充,这个需要按照像素格式来计算大小,必须为4的倍数
Bmp.LockBits(New Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite Or ImageLockMode.UserInputBuffer, PixelFormat.Format24bppRgb, BmpData)
Hanlde.Free()

  这种调用模式下,BitmapData对象的Scan0和Stride必须由用户自行计算,其中Scan0为保存解码后的数据内存的地址。在VB.NET中获取数组内存地址的代码似乎比VB6复杂一些,这一点我也不是特别在行。

调用上述代码后,PixleValue就已经保存了图像的数据了。

之后就是对图像数据进行各种各样的处理了。比如我们那前一段日子共享的色调均化的代码为例:

        For Y = 0 To Height - 1
Speed = Y * Stride ' 定位到每个扫描行的第一个像素,以避免溶于数据的影响
For X = 0 To Width - 1
HistGram(PixleValue(Speed)) += 1 ' Blue
HistGram(PixleValue(Speed + 1)) += 1 ' Green
HistGram(PixleValue(Speed + 2)) += 1 ' Red
Speed += 3 ' 移向下一个像素
Next
Next Num = 0
For Y = 0 To 255
Num = Num + HistGram(Y) ' 计算映射表
Lut(Y) = CByte(Math.Truncate(CSng(Num) / (Width * Height * 3) * 255))
Next
For Y = 0 To Height - 1
Speed = Y * Stride
For X = 0 To Width - 1
PixleValue(Speed) = Lut(PixleValue(Speed))
PixleValue(Speed + 1) = Lut(PixleValue(Speed + 1))
PixleValue(Speed + 2) = Lut(PixleValue(Speed + 2))
Speed += 3
Next
Next

  执行速度比较:针对上述算法,我们只比较算法的执行部分的耗时。

测试语言            测试图像(512*384)耗时      测试图像(1024*768)耗时    测试图像(4000*3000)耗时

VB.NET                7ms              25ms              178ms

c# 指针        4ms                                  16ms              100ms

c# 数组                     5ms                                  24ms              139ms

上表中可以明显看出指针在速度上还是有明显的优势的,唯一值得注意的是,VB.NET的数组版要比C#的数组版的速度要慢,由于VB.NET中我不知道怎么样查看其对应的反汇编码,所以我还不清楚这是为什么。

上述三种方案的代码下载:http://files.cnblogs.com/Imageshop/HistgramEqualize%28VB.NETandCsharp%29.rar

看来VB.NET确实不是图像处理方案的首选工具啊。

***************************作者: laviewpbt   时间: 2013.4.07    联系QQ:  33184777  转载请保留本行信息*************************

VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。的更多相关文章

  1. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  2. Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

    使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循 ...

  3. VB.NET中的除法运算符 与 C#中的除法运算符

    VB.NET中的除法运算符有两个:/(浮点除法).\(整数除法) C#中的除法运算符只有一个:/(除法) VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分. 关于VB.NE ...

  4. VB6中的引用传递 与 VB.NET中的引用传递的区别

    首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...

  5. VB.NET中使用Linq TO SQL添加数据后获得自增长列ID

    VB.NET中使用Linq TO SQL添加数据后获得自增长列ID: Dim tempOrdre As New Order With { .CustomerID = cmbCustomerName.S ...

  6. Visual Studio 2015中的常用调试技巧分享

    .NET 技术交流群:337901356 欢迎您的加入! 为什么要学习调试? 调试(Debug)是作为一个程序员必须要学会的东西,学会调试可以极大的提高开发效率,排错时间,很多人不喜欢调试,但我认为这 ...

  7. VB.NET中DataGridView控件

    VB.NET中对于表格数据的显示经常使用到DataGridView控件,其以丰富多样的数据表呈现形式被程序猿喜爱. 本人在做一个小系统中运用DataGridView控件的部分属性,这些功能的使用在使用 ...

  8. vb.net中存储过程的使用

    在机房收费系统过程中,试着使用了存储过程,离之前数据库的学习已经有些日子了.之前对于存储过程的了解也是听过而已,非常不清楚.因此,写这篇博客! 专业概念:存储过程是一个SQL语句和控制结构的集合,创建 ...

  9. ACM 做题过程中的一些小技巧。

    ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...

随机推荐

  1. Git GUI下载远程源代码简单使用介绍

    学习编程,适当的时候弄些开源项目的源代码来学习实践,对技术是很有帮助的.如果学习.NET.C#的话,codeplex上面有许多不错的源代码,推荐一个ASP.ENT的:HoverTree http:// ...

  2. python征程1.1(初识python)

    在学习python前必须要掌握的一些基本知识   1.编程语言 2.python   .  C#   JAVA 3.python:  pypy    cpython     jpython 4.执行方 ...

  3. MongoDB基础入门001--安装

    关于mongodb的好处,优点之类的这里就不说了,唯一要讲的一点就是mongodb中有三元素:数据库,集合,文档,其中"集合" 就是对应关系数据库中的"表",& ...

  4. spring aop注解配置

    spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码 可以在切面上实现合法性校验.权限检验.日志记录... spring aop 用的多的有两种配 ...

  5. CSS3 float深入理解浮动资料整理

    CSS浮动(float,clear)通俗讲解 CSS 浮动 CSS float浮动的深入研究.详解及拓展(一) CSS float浮动的深入研究.详解及拓展(二) 1.浮动实现图文环绕(理解难点) 浮 ...

  6. JS全屏漂浮广告、移入光标停止移动

    点击这里查看效果 以下是代码: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Ty ...

  7. 基础算法(javascipt)总结

    一.排序: 1.选择排序: 2.交换排序: 3.插入排序 二.查找: 三.节点遍历: 四.数组去重: 时间复杂度:找出算法中的基本语句->计算基本语句的执行次数的数量级->用大O记号表示算 ...

  8. Mysql(Mariadb) 基础操作语句 (持续更新)

    基础SQL语句,记录以备查阅.(在HeiDiSql中执行) # 创建数据库 Create Database If Not Exists VerifyIdear Character Set UTF8; ...

  9. arcgis server10.2.2之地理编码服务发布

    1.地理编码工具(Geocoding Tools)locator制作     打开arcCatalog,找到工具箱ArcToolbox中的Geocoding Tools---Create Addres ...

  10. VS2012 Unit Test —— 我对接口进行单元测试使用的技巧

    [题外话] 对单元测试不熟悉的童鞋可参照我之前写过的两篇博文: <在Visual Studio 2012使用单元测试>. <VS2012 单元测试之泛型类(Generics Unit ...