我想把 内存中的图片通过网络传输,要把显示在picturebox中的图片,或通过API创建的DIB位图,保存到一个二进制数组,在另外一台电脑上还原回位图
不能通过 savepicture 函数保存到磁盘上再读出来, 我想在内存中完成 ,我已有几个API 函数原形StretchDIBits
SetDIBitsToDeviceSetDIBitsGetDIBits
GetBitmapBits
SetBitmapBits
但不知道用法, 谁有代码,请帮我一下,急用,在线等 !
不能通过 savepicture 函数保存到磁盘上再读出来, 我想在内存中完成 ,我已有几个API 函数原形StretchDIBits
SetDIBitsToDeviceSetDIBitsGetDIBits
GetBitmapBits
SetBitmapBits
但不知道用法, 谁有代码,请帮我一下,急用,在线等 !
Private DIBInfo As BITMAPINFO 'Device Ind. Bitmap info structure'pic待读取数据位图,data保存图象数据
Public Sub ReadPic(ByVal pic As Long, data() As Byte) '读取位图数据
Dim hdcNew As Long
Dim oldhand As Long
Dim ret As Long
Dim BytesPerScanLine As Long '一个扫描行的长度
Dim PadBytesPerScanLine As Long
Call GetObject(pic, Len(PicInfo), PicInfo) '取得对指定对象进行说明的一个结构,hobject为位图,刷子等的句柄,
'count欲取回的字节数。通常是由lpObject定义的那个结构的长度
hdcNew = CreateCompatibleDC(0&) '创建一个与屏幕兼容的设备场景
oldhand = SelectObject(hdcNew, pic)
With DIBInfo.bmiHeader
.biSize = 40 'bmp3.0
.biWidth = PicInfo.bmWidth
.biHeight = -PicInfo.bmHeight '从下往上扫描
.biPlanes = 1
.biBitCount = 32 '32位位图,默认情况下Windows不会处理最高8位,可以将它作为自己的Alpha通道
.biCompression = BI_RGB '无压缩
BytesPerScanLine = ((((.biWidth * .biBitCount) + 31) \ 32) * 4) '一个扫描行的长度,是4的倍数。
PadBytesPerScanLine = _
BytesPerScanLine - (((.biWidth * .biBitCount) + 7) \ 8)
.biSizeImage = BytesPerScanLine * Abs(.biHeight)
End With
ReDim data(1 To 4, 1 To PicInfo.bmWidth, 1 To PicInfo.bmHeight) As Byte
ret = GetDIBits(hdcNew, pic, 0, PicInfo.bmHeight, data(1, 1, 1), DIBInfo, DIB_RGB_COLORS)
'将来自一幅位图的二进制位复制到一幅与设备无关的位图里
' 该函数利用申请到的内存,由GDI位图得到DIB位图数据,可以对DIB的格式进行控制,通过该函数,
'可以制定颜色的位数,而且可以指定是否进行压缩。如果采用了压缩方式,则必须调用该函数两次,
'一次为了得到所需内存,另外一次为了得到位图数据
'定义了与设备有关位图hBitmap的配置信息的一个设备场景的句柄
'hbmp 源位图的句柄
'uStartScan为欲复制到dib中的第一条扫描线的位置
'cScanLines欲复制的扫描先的数量
'ipvbits 指向一个缓冲区的指针
'指向BITMAPINF,对DIB的格式及颜色进行说明的一个结构。
'颜色表包含了RGB颜色
SelectObject hdcNew, oldhand
DeleteDC hdcNew
End Sub窗体中调用Private iDATA() As Byte 'holds bitmap data
Private Sub Command1_Click()
Picture1.ScaleMode = 3
ReDim iDATA(1 To 4, 1 To Picture1.ScaleWidth, 1 To Picture1.ScaleHeight) As Byte
Call ReadPic(Picture1.Image, iDATA())
Debug.Print iDATA(2, 54, 34)
End Sub
Open strFileName For Binary As #lNum
这个函数用于你的目的,总体感觉不够完美
zyl910啊,WallesCai啊等等向他们请教吧。祝你好运!
Private 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 Longhttp://www.21code.com/codebase/?pos=list&type=subclass&mainclass=1&subclass=13
http://community.csdn.net/Expert/topic/3600/3600495.xml?temp=.8192407
http://community.csdn.net/Expert/topic/3252/3252001.xml?temp=.6536524
http://community.csdn.net/Expert/topic/3667/3667654.xml?temp=.2818872
Dim a() As BytePrivate Sub Command1_Click()
Dim pb As New PropertyBag
pb.WriteProperty "Img", Picture1.Picture
a = pb.Contents
End SubPrivate Sub Command2_Click()
Dim pb As New PropertyBag
pb.Contents = a
Set Picture2.Picture = pb.ReadProperty("Img")
End Sub