转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
用VB写高效的图像处理程序         ★★★★
原型定义:
int StretchDIBits(
  HDC hDC,                // handle to device context
  int XDest,              // x-coordinate of upper-left corner of dest. rectangle
  int YDest,              // y-coordinate of upper-left corner of dest. rectangle
  int nDestWidth,         // width of destination rectangle
  int nDestHeight,        // height of destination rectangle
  int XSrc,               // x-coordinate of upper-left corner of source rectangle
  int YSrc,               // y-coordinate of upper-left corner of source rectangle
  int nSrcWidth,          // width of source rectangle
  int nSrcHeight,         // height of source rectangle
  CONST VOID *lpBits,            // address of bitmap bits
  CONST BITMAPINFO *lpBitsInfo,  // address of bitmap data
  UINT iUsage,                   // usage flags
  DWORD dwRop                    // raster operation code
);
VB声明: Declare Function StretchDIBits Lib "gdi32" (ByVal hDC As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nDestWidth As Long, ByVal nDestHeight As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, lpBits As Any, lpBitsInfo As Any, ByVal wUsage As Long, ByVal dwRop As Long) As Long 说明: 根据一幅与设备无关的位图创建一幅与设备有关的位图 返回值: 执行成功返回位图句柄,零表示失败 参数: hDC 一个设备场景的句柄,该设备场景定义了要创建的与设备有关位图的配置信息 XDest 指定绘制区域的左上角X坐标 YDest 指定绘制区域的左上角Y坐标 nDestWidth 指定绘制区域的高度 nDestHeight 指定绘制区域的宽度 XSrc 矩形在DIB中的起点X坐标 YSrc 矩形在DIB中的起点Y坐标 nSrcWidth 指定原位图绘制区域的左上角X坐标 nSrcHeight 指定原位图绘制区域的左上角Y坐标 lpBits 指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpBitsInfo指定的 lpBitsInfo 指向BITMAPINFO(为兼容BMP4/5而声明成Any),对DIB的格式和颜色进行描述的一个结构 iUsage DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引 DIB_RGB_COLORS 颜色表包含了RGB颜色 dwRop 欲进行的光栅运算
原型定义:
HBITMAP CreateDIBitmap(
  HDC hDC,                  // handle to device context
  CONST BITMAPINFOHEADER *lpbmih,  // pointer to bitmap size and format data
  DWORD fdwInit,            // initialization flag
  CONST VOID *lpbInit,      // pointer to initialization data
  CONST BITMAPINFO *lpbmi,  // pointer to bitmap color-format data
  UINT fuUsage              // color-data usage
);
VB声明: Declare Function CreateDIBitmap Lib "gdi32" (ByVal hDC As Long, lpbmih As Any, ByVal fdwInit As Long, lpbInit As Any, lpbmi As Any, ByVal fuUsage As Long) As Long 说明: 将一幅与设备无关位图的全部或部分数据直接复制到一个设备。这个函数在设备中定义了一个目标矩形,以便接收位图数据。它也在DIB中定义了一个源矩形,以便从中提取数据 返回值: 执行成功则返回扫描线的数量,零表示失败。会设置GetLastError 参数: hDC 一个设备场景的句柄。该场景用于接收位图数据 lpbmih BITMAPINFOHEADER(为兼容BMP4/5而声明成Any),对DIB的格式进行描述的一个结构 fdwInit 如不应对位图数据进行初始化,那么设为零。如设为CBM_INIT,表示根据lpbInit和 lpbmi参数对位图进行初始化 lpbInit 指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的 lpbmi 指向BITMAPINFO(为兼容BMP4/5而声明成Any),对DIB的格式和颜色进行描述的一个结构 fuUsage DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引 DIB_RGB_COLORS 颜色表包含了RGB颜色
原型定义:
HBITMAP CreateDIBSection(
  HDC hDC,          // handle to device context
  CONST BITMAPINFO *lpbmi,
                    // pointer to structure containing bitmap size, format, and color data
  UINT iUsage,      // color data type indicator: RGB values or palette indexes
  VOID *ppvBits,    // pointer to variable to receive a pointer to  the bitmap''''s bit values
  HANDLE hSection,  // optional handle to a file mapping object
  DWORD dwOffset    // offset to the bitmap bit values within the file mapping object
);
VB声明: Declare Function CreateDIBSection Lib "gdi32" (ByVal hDC As Long, lpbmi As Any, ByVal iUsage As Long, ByRef ppvBits As Long, ByVal hSection As Long, ByVal dwOffset As Long) As Long 说明: CreateDIBSection能创建一种特殊的DIB,称为DIB项(DIBSection),然后返回一个GDI位图的句柄。它提供了DIB和GDI位图的最好的特性。这样我们可以直接访问DIB的内存,可以利用位图句柄和内存设备环境,我们甚至还可以在DIB中调用GDI函数来绘图 返回值: 执行成功返回DIBSection位图的句柄,零表示失败。会设置GetLastError 参数: hDC 一个设备场景的句柄。如dw设为DIB_PAL_COLORS,那么DIB颜色表就会用来自逻辑调色板的颜色进行初始化 lpbmi 指向BITMAPINFO(为兼容BMP4/5而声明成Any),这个结构初始化成欲创建的那幅位图的配置数据 iUsage DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引 DIB_RGB_COLORS 颜色表包含了RGB颜色 ppvBits 用于得到DIBSection数据区的内存地址 hSection 指向一个文件映射对象的可选句柄,位图将在其中创建。如设为零,Windows会自动分配内存 dwOffset 如指定了句柄,就用这个参数指定位图数据在文件映射对象中的偏移量
原型定义:
int GetDIBits(
  HDC hDC,           // handle to device context
  HBITMAP hbmp,      // handle to bitmap
  UINT uStartScan,   // first scan line to set in destination bitmap
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // address of array for bitmap bits
  LPBITMAPINFO lpbmi,// address of structure with bitmap data
  UINT uUsage        // RGB or palette index
);
VB声明: Declare Function GetDIBits Lib "gdi32" (ByVal hDC As Long, ByVal hbmp As Long, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As Any, lpbmi As Any, ByVal uUsage As Long) As Long 说明: 该函数利用申请到的内存,由GDI位图得到DIB位图数据。通过该函数,可以对DIB的格式进行控制,可以制定颜色的位数,而且可以指定是否进行压缩。如果采用了压缩方式,则必须调用该函数两次,一次为了得到所需内存,另外一次为了得到位图数据 返回值: 执行成功则返回扫描线的数量,零表示失败。会设置GetLastError 参数: hDC 定义了与设备有关位图hBitmap的配置信息的一个设备场景的句柄 hbmp 源位图的句柄 uStartScan 欲复制到DIB中的第一条扫描线的编号 cScanLines 欲复制的扫描线数量 lpvBits 指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的 lpbmi 指向BITMAPINFO(为兼容BMP4/5而声明成Any).对DIB的格式及颜色进行说明的一个结构。在BITMAPINFOHEADER结构中,从biSize到biCompression之间的所有字段都必须初始化 uUsage DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引 DIB_RGB_COLORS 颜色表包含了RGB颜色
原型定义:
int SetDIBits(
  HDC hDC,                  // handle to device context
  HBITMAP hbmp,             // handle to bitmap
  UINT uStartScan,          // starting scan line
  UINT cScanLines,          // number of scan lines
  CONST VOID *lpvBits,      // array of bitmap bits
  CONST BITMAPINFO *lpbmi,  // address of structure with bitmap data
  UINT uUsage               // type of color indexes to use
);
VB声明: Declare Function SetDIBits Lib "gdi32" (ByVal hDC As Long, ByVal hbmp As Long, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As Any, lpbmi As Any, ByVal uUsage As Long) As Long 说明: 将来自与设备无关位图的二进制位复制到一幅与设备有关的位图里 返回值: 执行成功则返回扫描线的数量,零表示失败。会设置GetLastError 参数: hDC 定义了与设备有关位图hBitmap的配置信息的一个设备场景的句柄 hbmp 源位图的句柄 uStartScan 欲复制到DIB中的第一条扫描线的编号 cScanLines 欲复制的扫描线数量 lpvBits 指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的 lpbmi 指向BITMAPINFO(为兼容BMP4/5而声明成Any).对DIB的格式及颜色进行说明的一个结构。在BITMAPINFOHEADER结构中,从biSize到biCompression之间的所有字段都必须初始化 uUsage DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引 DIB_RGB_COLORS 颜色表包含了RGB颜色
原型定义:
UINT GetDIBColorTable(
  HDC hDC,          // handle to device context whose DIB is of interest
  UINT uStartIndex, // color table index of first entry to retrieve
  UINT cEntries,    // number of color table entries to retrieve
  RGBQUAD *pColors  // pointer to buffer that receives color table entries
);
VB声明: Declare Function GetDIBColorTable Lib "gdi32" (ByVal hDC As Long, ByVal uStartIndex As Long, ByVal cEntries As Long, pColors As RGBQUAD) As Long 说明: 从选入设备场景的DIBSection中取得颜色表信息 返回值: 取回的颜色条目数量,零表示失败。会设置GetLastError 参数: hDC 已选入了一个DIBSection对象的设备场景 uStartIndex 颜色表中欲取回的第一个条目的索引 cEntries 欲取回的条目数量 pColors 这个结构数组用于装载颜色表信息的第一个条目
原型定义:
UINT SetDIBColorTable(
  HDC hDC,                // handle to device context whose DIB is of interest
  UINT uStartIndex,       // color table index of first entry to set
  UINT cEntries,          // number of color table entries to set
  CONST RGBQUAD *pColors  // pointer to array of color table entries
);
VB声明: Declare Function SetDIBColorTable Lib "gdi32" (ByVal hDC As Long, ByVal uStartIndex As Long, ByVal cEntries As Long, pColors As RGBQUAD) As Long 说明: 从选入设备场景的DIBSection中取得颜色表信息 返回值: 取回的颜色条目数量,零表示失败。会设置GetLastError 参数: hDC 已选入了一个DIBSection对象的设备场景 uStartIndex 颜色表中欲取回的第一个条目的索引 cEntries 欲取回的条目数量 pColors 这个结构数组用于装载颜色表信息的第一个条目

四、实战练习

  用DIB写图像处理程序的时候,首先要明确一点:DIB并不是图像处理算法,而是一种绘图方法。处理算法比DIB高一级,管理坐标和颜色的运算;而DIB只是为了绘制。所以此时处理算法的效率是速度的关键。

  利用DIB绘制图像并没有比用PSet/SetPixel绘制差多少,它只是把坐标运算改成地址运算而已。很多人知道指针是一个危险的东西,就是因为它能直接访问内存,如果指针不小心指错地方的话,Windows立即报告一般保护性错误。所以,在地址运算的时候一定要小心,同时要注意随时保存,因为此时的非法操作的发生率非常高,否则辛辛苦苦写的代码一瞬间没了可别怪我没提醒啊。


  好了,现在开始!

  由于处理算法起指导作用,所以现在先讲解VB_PSet。所有的代码都在FrmMain.frm中。其他的过程的代码可以不看,现在将注意力集中在“DrawIt”中,它就是管绘制的。

  其实我这个演示程序蛮简单的:R分量延着水平方向增加,G分量延着垂直方向增加,B分量则从右往左滚动。什么?!“And &HFF”是什么意思?!这可是基础啊……(下略&HFFFF...字)。“&H”表示十六进制数,而And表示按位与。&HFF是二进制的“1111 1111”,正好覆盖了低8位,这时用And进行按位与,只会得到低8位,与RGB分量需要的8位正好符合(对于“(J + K) And &HFF”来说,可以实现滚动效果)。

  If Not 看明白了 Then Goto 前两段

  好!现在打开VB_DIB。(由于24位能直接指定RGB分量,所以这里是用的是24位DIB)

  看了前面的“DIB的结构”,是不是有点昏呢?其实DIB也没什么,就是 一个表述位图信息的BITMAPINFO结构 和 一个存储位图数据的数据缓冲区,顶多再用SetDIBitsToDevice绘制,所以VB_DIB与VB_PSet相比只是多了SetDIBitsToDevice、BITMAPINFOHEADER(24位DIB没有调色板,所以用BITMAPINFOHEADER就行)和一些常数的声明而已。由于这个演示程序不需要改变图像大小和色深,所以可以把有关变量作为窗体级变量,再在Form_Load中初始化。由于DIB并没有向系统申请资源(数组的内存是VB分配的,会自动释放),所以不需要写释放代码。

  现在来看DrawIt。
  1.虽然可以逐点把坐标映射成地址再写,但是这样效率太低了,可以利用坐标处理的连续性进行优化。
  2.由于我这里用的是数组,所以这里用(数组元素)索引代替地址。
  3.最开始要注意DIB是逆序存储的,要将索引设为最后一行第一个像素的索引。
  4.由于DIB的RGB顺序是B、G、R,所以“MapData(CurIdx + ?)”的顺序是2、1、0。
  5.设置好一个像素的颜色后,要注意把索引改为下个像素的索引。
  6.由于DIB是逆序存储的,移到下一个扫描行是“LineIdx = LineIdx - LineBytes”


  “好了,代码看懂了,按F5运行看看效果。”
  “咦?速度好像没快多少啊?”

  这是由于程序在VB环境下是以解释方式运行的,而解释方式对做图像处理所需要大规模循环和大量的算术运算的执行效率很低,所以要编译成(本机代码)exe再运行。此时还要注意编译优化,可以把“高级优化”的所有勾打上,速度可提升20%左右。


五、使用DIBSection和模拟指针

  虽然有GetDIBits/SetDIBits函数,但是DIB与GDI位图之间的数据交换还是很不方便,特别处理过程中需要调用GDI函数来处理的时候。而且就算你不怕麻烦,但这样做的处理效率很低。所以Windows为我们提供了DIBSection。DIBSection是一种特殊的DIB,它除了可以

上一页  [1] [2] [3]  下一页


没有相关教程

用VB写高效的图像处理程序

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2328 更新时间:2009/4/23 18:59:35
指向BITMAPINFO(为兼容BMP4/5而声明成Any),对DIB的格式和颜色进行描述的一个结构 fuColorUse DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引 DIB_RGB_COLORS 颜色表包含了RGB颜色
StretchDIBits CreateDIBitmap CreateDIBSection GetDIBits SetDIBits GetDIBColorTable SetDIBColorTable
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台