用下面的API试试: Declare Function SetDIBits Lib "gdi32" Alias "SetDIBits" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long 或用下面的: Declare Function SetBitmapBits Lib "gdi32" Alias "SetBitmapBits" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
谢谢楼上的 如果是GIF图片,这两个API也可以使用吗?
如果是GIF文件,可以先用LoadPicture将其装入,如 dim p as Picture '或stdPicture,iPicture set p=loadpicture("gif file name") 这样就可以很自由地使用图片对象p了。
图像文件与图像数据还是有区别的!SetDIBits与SetBitmapBits只是针对位图的数据部分,而文件还会在其前面加上BITMAPFILEHEADER与BitMapInfoHeader,当然还有可能的调色板! 更何况,它们操作对象只能是位图!文件,当然可用LoadPicture载入,但文件的byte数组就不上不下了,它成了LoadPicture的一个中间步骤,你需要自已去干一些LoadPicture的事情。非得请API出马了!Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As GUID, ppvObj As Any) As Long主要用它,可将内存中的流数据转为Picture对象,Picture的GUID为{7BF80980-BF32-101A-8BBB-00AA00300CAB}。 创建流数据,可用 Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long注意:这个函数只能用Global内存,不能直接使用VB的Byte数组
Declare Function SetDIBits Lib "gdi32" Alias "SetDIBits" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
或用下面的:
Declare Function SetBitmapBits Lib "gdi32" Alias "SetBitmapBits" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
如果是GIF图片,这两个API也可以使用吗?
dim p as Picture
'或stdPicture,iPicture
set p=loadpicture("gif file name")
这样就可以很自由地使用图片对象p了。
更何况,它们操作对象只能是位图!文件,当然可用LoadPicture载入,但文件的byte数组就不上不下了,它成了LoadPicture的一个中间步骤,你需要自已去干一些LoadPicture的事情。非得请API出马了!Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As GUID, ppvObj As Any) As Long主要用它,可将内存中的流数据转为Picture对象,Picture的GUID为{7BF80980-BF32-101A-8BBB-00AA00300CAB}。
创建流数据,可用
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long注意:这个函数只能用Global内存,不能直接使用VB的Byte数组