快速读写Bmp图片

来源:互联网 发布:数据报表软件 编辑:程序博客网 时间:2024/04/30 01:26

一、使用MS的stdPicture对象创建一个实体,一般为LoadPicture(FileName)
二、得到stdPicture对象的数据信息
Private Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
GetObjectAPI lpPic, Len(bmp), bmp ' lpPic As StdPicture
三、创建一个安全数组,通过CopyMemory强行修改数据指针指向lpPic的数据
首先看看VB或者叫做COM里面的安全数组,
感谢 lioomany VB指针葵花宝典之SafeArray
在VB里我们传递一个数组时,传递的实际上COM里的SafeAraay结构指构的指针,SafeAraay结构样子如下:
Private Type SAFEARRAY
cDims As Integer '这个数组有几维?
fFeatures As Integer '这个数组有什么特性?
cbElements As Long '数组的每个元素有多大?
cLocks As Long '这个数组被锁定过几次?
pvData As Long '这个数组里的数据放在什么地方?
'rgsabound() As SFArrayBOUND
End Type
紧接在pvData这后的rgsabound是个真数组,所以不能在上面的结构里用VB数组来声明,记住,在VB里的数组都是SafeArray,在VB里没有声明真数组的方法。 不过这不是问题,因为上面SFArrayBOUND结构的真数组在整个SAFEARRAY结构的位置是不变的,总是在最后,我们可以用指针来访问它。SFArrayBOUND数组的元素个数有cDims个,每一个元素记录着一个数组维数的信息,下面看看它的样子:
Private Type SAFEARRAYBOUND
cElements As Long '这一维有多少个元素?
lLbound As Long '它的索引从几开始?
End Type
对于二维数组的话就是rgsabound(0),rgsabound(1)了,所以我们的创建如下:
dim sa as SAFEARRAY,data() as Byte
With sa
.cbElements = 1
.cDims = 2
.Bounds(0).lLbound = 0
.Bounds(0).cElements = bmp.bmHeight
.Bounds(1).lLbound = 0
.Bounds(1).cElements = bmp.bmWidthBytes
.pvData = bmp.bmBits
End With
' copy bitmap data into byte array
CopyMemory ByVal VarPtrArray(data), VarPtr(sa), 4
使data->sa结构即可!!!
不过请你千万记得要自己销毁指针,呵呵,既然享受了指针的好处,也要记得对指针负责哦;-) PS:这里指针可以理解为MM
文章摘自http://blog.gameres.com/thread.asp?BlogID=404&;threadid=43939
 
 
 
原创粉丝点击