ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:27.64KB ,
资源ID:29783746      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29783746.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用VB写高效的图像处理程序doc资料.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

用VB写高效的图像处理程序doc资料.docx

1、用VB写高效的图像处理程序doc资料用VB写高效的图像处理程序用VB写高效的图像处理程序自盘古开天地以来(好像夸张了点),一直有人抱怨VB程序速度慢。特别是图像处理,被认为是VB的禁区。说起来也是,市面上的关于VB的图像处理的数据都是先讲计算公式,再直接用PSet(或API函数SetPixel)逐点画(至少我见过的书都是这样)。效果是办到了,但速度慢得离谱:对一幅640*480的图像进行半透明合并就需要10秒钟;而在PhotoShop中,只要一设置图层的透明度,半透明效果立即呈现。难怪有人说VB的闲话。但这并不表示VB不能写高速的图像处理程序,速度慢是因为没有使用正确的方法。从VB5开始,能以

2、本机代码编译成exe文件,所以不存在代码执行速度的问题。那么,是什么拖慢了速度呢?就是PSet和SetPixel!PSet把浮点形式的坐标转为像素单位,再交给SetPixel处理。而SetPixel呢,坐标系转化、剪裁区域判断、将颜色匹配为设备支持的最接近的,最后还要根据不同的颜色格式寻址、为将颜色写入其所在位进行位运算。经过这么多层处理,速度不慢才怪。那么,怎样才能提高处理速度呢?使用DIB,直接对位图所在内存进行操作,速度可以大大提高。现在看看,这只是一个简单的色彩演示程序。CPU:赛扬333;内存:PC100(很老的概念了)的SDRAM,128MB;单位:毫秒Windows 98Wind

3、ows XP说明VB_PSet1,199.4553786.1885在VB使用 PSet 画的VB_SetPixel872.3621451.3712在VB使用 SetPixelV 画的VB_DIB8.22188.2226在VB使用 DIB 画的VB_DIB_Ptr9.67839.4420在VB使用 DIBSection + 模拟指针 画的VC(Debug)6.68966.6503VC写的(Debug版)VC(Release)3.27363.6247VC写的(Release版)从这个表中可看出:1.VC比VB_DIB、VB_DIB_Ptr快两倍,这是因为SafeArray结构的数组比真正的指针慢,

4、但也不是某些人所说的70100倍;2.VB_DIB_Ptr比VB_DIB慢一点,这是因为模拟指针本来就是靠SafeArray结构的数组,而且模拟指针需要对两个数组进行操作,所以速度慢一点;3.真正差了70100倍是VB_PSet和VB_SetPixel,特别是VB_PSet在Windows98下与VB_DIB差了145倍。以上可证,速度慢的原因是SetPixel非常低效,而并不是VB的问题。虽然VC的的确比较快,但是我写这篇文章不是为了讨论速度极限(否则这篇文章会改名为如何用汇编写高速的图像处理程序),而是为了告诉大家如何在VB中写能够实时处理的图像处理程序。在 Windows 3.0 以前,

5、Windows系统用的是DDB(设备有关位图)。DDB没有调色板,显示的颜色依赖硬件,处理色彩很不方便。所以 Microsoft 在 Windows 3.0中 重新定义了BMP文件格式(BMP 3.0),使其支持设备无关位图也就是DIB。时至今日,BMP的版本号已升至5.0(Windows NT 4.0、Windows95 定义了 BMP 4.0,Windows 98、Windows 2000 定义了 BMP 5.0),但基本结构没有变仍是 BMP文件头 和 DIB 组成:BMP文件BITMAPFILEHEADERBMP文件头DIBBITMAPINFOHEADER位图信息头RGBQUAD调色板

6、位图数据(#代表可以不填(=0)的项目)BMP文件头BITMAPFILEHEADER原型定义:typedef struct tagBITMAPFILEHEADER / bmfh WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER;VB声明:Type BITMAPFILEHEADER bfType(0 to 1) As Byte bfSize As Long bfReserved1 As Integer bfReserved2 As Integer bfO

7、ffBits As Long End Type说明:bfType指示文件的类型,必须是“BM”bfSize#指示文件的大小,包括BITMAPFILEHEADERbfReserved1保留,=0bfReserved2保留,=0bfOffBits#从文件头到位图数据的偏移字节数文件信息头BITMAPINFOHEADER原型定义:typedef struct tagBITMAPINFOHEADER / bmih DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression;

8、 DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER;VB声明:Type BITMAPINFOHEADER biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Lo

9、ng biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type说明:biSizeBITMAPINFOHEADER结构的大小。BMP有多个版本,就靠biSize来区别:BMP3.0:BITMAPINFOHEADER(=40)BMP4.0:BITMAPV4HEADER(=108)BMP5.0:BITMAPV5HEADER(=124)biWidth位图的高度,单位是像素biHeight位图的宽度,单位是像素biPlanes设备的位平面数。现在都是1biBitCount图像的颜色位数 0:当biCompressi

10、on=BI_JPEG时必须为0(BMP 5.0) 1:单色位图 4:16色位图 8:256色位图16:增强色位图,默认为555格式24:真彩色位图32:32位位图,默认情况下Windows不会处理最高8位,可以将它作为自己的Alpha通道biCompression压缩方式BI_RGB:无压缩BI_RLE8:行程编码压缩,biBitCount必须等于8BI_RLE4:行程编码压缩,biBitCount必须等于4BI_BITFIELDS:指定RGB掩码,biBitCount必须等于16、32BI_JPEG:JPEG压缩(BMP 5.0)BI_PNG:PNG压缩(BMP 5.0)biSizeImag

11、e#实际的位图数据所占字节(biCompression=BI_RGB时可以省略)biXPelsPerMeter#目标设备的水平分辨率,单位是每米的像素个数biYPelsPerMeter#目标设备的垂直分辨率,单位是每米的像素个数biClrUsed#使用的颜色数(当biBitCount等于1、4、8时才有效)。如果该项为0,表示颜色数为2biBitCountbiClrImportant#重要的颜色数。如果该项为0,表示所有颜色都是重要的调色板只有biBitCount等于1、4、8时才有调色板。调色板实际上是一个数组,元素的个数由biBitCount和biClrUsed决定。原型定义:typede

12、f struct tagRGBQUAD / rgbq BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; RGBQUAD;VB声明:Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte rgbReserved As Byte End Type说明:rgbBlue蓝色分量rgbGreen绿色分量rgbRed红色分量rgbReserved#保留,=0位图数据扫描行:一行的图像数据叫做一个扫描行。一个扫描行的长度必须是4的倍数(字节),如果不是,则需

13、要补齐。计算公式:LineBytes=(biWidth*biBitCount+31)And &HFFFFFFE0)8由于BMP设定者认为数学坐标系更总要,所以DIB的扫描行是逆序存储的(相对于屏幕坐标系而言),即屏幕上的第一行是DIB位图数据的最后一行。1位色:用1位表示一个像素,所以一个字节可以表示8个像素。坐标是从最左边(最高位)开始的,而不是一般情况下的最低位。在内存的摆放形式如下:字节0.位76543210像素012345674位色:用4位表示一个像素,所以一个字节可以表示2个像素。坐标是从最左边(最高位)开始的,而不是一般情况下的最低位。在内存的摆放形式如下:字节0.位7654321

14、0像素01像素位321032108位色:用8位表示一个像素,所以一个字节刚好只能表示一个像素。在内存的摆放形式如下:字节01.像素0116位色:用16位表示一个像素,所以两个字节可以表示1个像素。默认情况下16位DIB是555格式,最高位无效(这对VB是个福音,因为VB没有16位无符号型)。在内存的摆放形式如下(PC机是低字节在前):字节0123.位76543210765432107654321076543210像素01RGBGBxRGGBxRGRGB位2104321004321043210432100432104324位色:用24位表示一个像素,所以三个字节可以表示1个像素。注意它的顺序是B

15、GR,而不是传统的RGB。在内存的摆放形式如下:字节012345.像素01RGBBGRBGR32位色:用32位表示一个像素,所以四个字节可以表示1个像素。注意绝大多数的GDI函数不会处理Alpha通道(只有AlphaBlend支持)。在内存的摆放形式如下:字节01234567.像素01RGBBGRABGRASetDIBitsToDevice原型定义:int SetDIBitsToDevice( HDC hDC, / handle to device context int XDest, / x-coordinate of upper-left corner of dest. rect. int

16、 YDest, / y-coordinate of upper-left corner of dest. rect. DWORD dwWidth, / source rectangle width DWORD dwHeight, / source rectangle height int XSrc, / x-coordinate of lower-left corner of source rect. int YSrc, / y-coordinate of lower-left corner of source rect. UINT uStartScan, / first scan line

17、in array UINT cScanLines, / number of scan lines CONST VOID *lpvBits, / address of array with DIB bits CONST BITMAPINFO *lpbmi, / address of structure with bitmap info. UINT fuColorUse / RGB or palette indexes );VB声明:Declare Function SetDIBitsToDevice Lib gdi32.dll (ByVal hDC As Long, ByVal XDest As

18、 Long, ByVal YDest As Long, ByVal dwWidth As Long, ByVal dwHeight As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As Any, lpbmi As Any, ByVal fuColorUse As Long) As Long说明:将一幅与设备无关位图的全部或部分数据直接复制到一个设备。这个函数在设备中定义了一个目标矩形,以便接收位图数据。它也在DIB中定义了一个

19、源矩形,以便从中提取数据返回值:如函数执行成功,返回欲复制的扫描线的数量;如返回常数GDI_ERROR,表示出错参数:hDC一个设备场景的句柄。该场景用于接收位图数据XDest指定绘制区域的左上角X坐标YDest指定绘制区域的左上角Y坐标dwWidth指定绘制区域的高度dwHeight指定绘制区域的宽度XSrc矩形在DIB中的起点X坐标YSrc矩形在DIB中的起点Y坐标uStartScanlpvBits中第一条扫描线的编号。如lpbmi之BITMAPINFOHEADER部分的biHeight字段是正数,那么这条扫描线就会从位图的底部开始计算;如果是负数,就从顶部开始计算cScanLines欲复

20、制的扫描线数量lpvBits指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的lpbmi指向BITMAPINFO(为兼容BMP4/5而声明成Any),对DIB的格式和颜色进行描述的一个结构fuColorUseDIB_PAL_COLORS颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引DIB_RGB_COLORS颜色表包含了RGB颜色StretchDIBits原型定义:int StretchDIBits( HDC hDC, / handle to device context int XDest, / x-coordinate

21、 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

22、 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声明:Dec

23、lare 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,

24、ByVal dwRop As Long) As Long说明:根据一幅与设备无关的位图创建一幅与设备有关的位图返回值:执行成功返回位图句柄,零表示失败参数:hDC一个设备场景的句柄,该设备场景定义了要创建的与设备有关位图的配置信息XDest指定绘制区域的左上角X坐标YDest指定绘制区域的左上角Y坐标nDestWidth指定绘制区域的高度nDestHeight指定绘制区域的宽度XSrc矩形在DIB中的起点X坐标YSrc矩形在DIB中的起点Y坐标nSrcWidth指定原位图绘制区域的左上角X坐标nSrcHeight指定原位图绘制区域的左上角Y坐标lpBits指向一个缓冲区的指针。这个缓冲区包含了

25、以DIB格式描述的位图数据;这种格式是由lpBitsInfo指定的lpBitsInfo指向BITMAPINFO(为兼容BMP4/5而声明成Any),对DIB的格式和颜色进行描述的一个结构iUsageDIB_PAL_COLORS颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引DIB_RGB_COLORS颜色表包含了RGB颜色dwRop欲进行的光栅运算CreateDIBitmap原型定义:HBITMAP CreateDIBitmap( HDC hDC, / handle to device context CONST BITMAPINFOHEADER *lpbmih, /

26、 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, lpbmi

27、h As Any, ByVal fdwInit As Long, lpbInit As Any, lpbmi As Any, ByVal fuUsage As Long) As Long说明:将一幅与设备无关位图的全部或部分数据直接复制到一个设备。这个函数在设备中定义了一个目标矩形,以便接收位图数据。它也在DIB中定义了一个源矩形,以便从中提取数据返回值:执行成功则返回扫描线的数量,零表示失败。会设置GetLastError参数:hDC一个设备场景的句柄。该场景用于接收位图数据lpbmihBITMAPINFOHEADER(为兼容BMP4/5而声明成Any),对DIB的格式进行描述的一个结构fd

28、wInit如不应对位图数据进行初始化,那么设为零。如设为CBM_INIT,表示根据lpbInit和 lpbmi参数对位图进行初始化lpbInit指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的lpbmi指向BITMAPINFO(为兼容BMP4/5而声明成Any),对DIB的格式和颜色进行描述的一个结构fuUsageDIB_PAL_COLORS颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引DIB_RGB_COLORS颜色表包含了RGB颜色CreateDIBSection原型定义:HBITMAP CreateDIBSecti

29、on( 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 bitmaps bit values HANDLE hSection, / optional handle to a f

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1