VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。
2013-06-29 21:27
871 查看
早期的时候我使用的开发工具是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,该模式下需要用户先申请内存,然后在把图像数据按照相关格式填充如这个内存中。这样,就可以先定义个数组,然后把图像数据填充到这个数组中,就避免了来回拷贝的耗时了,简单示例代码如下:
调用上述代码后,PixleValue就已经保存了图像的数据了。
之后就是对图像数据进行各种各样的处理了。比如我们那前一段日子共享的色调均化的代码为例:
测试语言 测试图像(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 转载请保留本行信息*************************
首先,还是谈谈图像像素时数据获取方面吧,.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#图像处理的差距。
- VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。
- 对于C#的一些奢望(对微软的一种幻想,对ASP.NET,WEB,计算机,.NET,以及一些现状的抱怨)
- [VB.NET]VB 图像处理
- VB.NET轻松学会处理时间技巧(一)
- 用Delphi 、VB.net以及C#混合编程
- c# 数字图像处理的一些方法
- C#中图像处理的基础知识和技巧
- 对于C#的一些奢望(对微软的一种幻想,对ASP.NET,WEB,计算机,.NET,以及一些现状的抱怨)
- 对VB.NET 项目整个处理过程的一些体会(更新中)
- vb.net 教程 5-16 图像处理之ImageAttributes 类2 颜色矩阵4
- ASP.NET 2.0网站专案同时使C#与VB.NET之技巧(新书连载)
- 用Delphi 8、VB.net以及C#混合编程(转贴)
- ASP.NET 2.0网站专案同时使C#与VB.NET之技巧(新书连载)
- vb.net 教程 5-15 图像处理之内存处理 4
- ASP.NET 2.0网站专案同时使C#与VB.NET之技巧(新书连载)
- vb.net 教程 5-14 图像处理之内存处理基础3
- VB.NET与C#的一些区别
- ASP.NET 2.0网站专案同时使C#与VB.NET之技巧(新书连载)
- 图像处理控件ImageGear for .NET教程:C# WPF应用程序创建示例(1)