获取图片二进制流

时间:2021-09-09 20:56:52
想要的到 一个Picture对象里面的二进制流数据 ,这个数据直接拿到c#里面能保存成图片.
现在用GetBitmapBits取到了像素的数据, 但是没有头信息的数据, 请各位大侠帮忙, 谢谢

17 个解决方案

#1


如果需要全部的文件数据 为什么不把图象保存在本地呢 用binary打开 得到的不是包含文件头的二进制流数据吗?

#2


调用用 SavePicture 把Picture对象的内容保存到本地文件,你要的什么信息都有了。

#3


ActiveX 不方便保存在本地, 要在内存完成

#4


GetObject.

#5


具体一些?

#6


引用 4 楼 laviewpbt 的回复:
GetObject.

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Const OBJ_BITMAP = 7
Private Type BITMAP '14 bytes
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
End Type

Sub GetBmpInfo()
    Dim bmp As BITMAP
    
    GetObject Me.Picture.Handle, Len(bmp), bmp
End Sub
BITMAP结构里已包含图像的所有信息了。

#7


引用 4 楼 laviewpbt 的回复:
GetObject.

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Type BITMAP '14 bytes
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
End Type

Sub GetBmpInfo()
    Dim bmp As BITMAP
    
    GetObject Me.Picture.Handle, Len(bmp), bmp
End Sub
BITMAP结构里已包含图像的所有信息了。

#8


你只获得了像素的数据,当然没有头了。

#9


引用 6 楼 lyserver 的回复:
引用 4 楼 laviewpbt 的回复:

GetObject. 

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long 
Private Const OBJ_BITMAP = 7 
Private Type BITMAP '14 bytes 
        bmType As Long 
        bmWidth As Long 
        bmHeight As Long 
        bmWidthBytes As Long 
        bmPlanes As Integer 
        bmBitsPixel As …


这个是头信息 
我想要的是完整的数据流, 就跟从文件打开一样的(信息头+数据) ,一个完整的流 不是分开的

#10


引用 8 楼 chenjl1031 的回复:
你只获得了像素的数据,当然没有头了。


是的, 我不是说用GetBitmapBits获取所有, 其他方法的只要能取到所有数据就可以

#11


要完整的数据流就不要用GetBitmapBits,图像在内存中文件头头信息和图像数据本来就不是依顺序存放的,要流的话用GDI+  Savetostream函数

#12


引用 11 楼 laviewpbt 的回复:
要完整的数据流就不要用GetBitmapBits,图像在内存中文件头头信息和图像数据本来就不是依顺序存放的,要流的话用GDI+  Savetostream函数

vb里面可以用吗? 查了查都是delphi在用这个函数

#13


我认为大家都考虑多了,二进制流数据直接放到一个byte数组就行了,有多少放多少,原汁原味,不必那么麻烦

#14


引用 13 楼 SYSSZ 的回复:
我认为大家都考虑多了,二进制流数据直接放到一个byte数组就行了,有多少放多少,原汁原味,不必那么麻烦


我用过这个方法
    Dim tmpPic As Picture
    Set tmpPic = CaptureWindow(hWndActive, False, x, y, x + w, y + h) '获取图片
    Dim PBag As New PropertyBag
    Dim B() As Byte
    PBag.WriteProperty "Picture", tmpPic '读取tmpPicture 图片并写到 Pbag 容器中
    
    B = PBag.Contents '获取容器Byte 到 B() 数组中
    Set PBag = Nothing

不过得到的数组B 好像不对 大小比通过GetBitmapBits得到的数组还小 , 而且在C#里面不能转换成图片

#15


我试了一下,
 Dim PBag As New PropertyBag 
    Dim B() As Byte 
    PBag.WriteProperty "Picture", tmpPic '读取tmpPicture 图片并写到 Pbag 容器中 
    
    B = PBag.Contents '获取容器Byte 到 B() 数组中 
得到的数据已不是原来的数据,就在本程序段已不能加载为图片

#16


难道必须保存成文件再读取才能得到二进制流?

#17


这个函数已经是Windows遗弃的孤儿了,应该用更先进的函数GetDIBits,它的第6个参数lpbi接受bitmap的头信息结构指针(需要自己先填充,因为不同类型的bitmap,取得的数据是不同的)。然后连同这个结构和取得的数据,在加上14字节的文件头,就是一个完整的.bmp磁盘位图文件了。

#1


如果需要全部的文件数据 为什么不把图象保存在本地呢 用binary打开 得到的不是包含文件头的二进制流数据吗?

#2


调用用 SavePicture 把Picture对象的内容保存到本地文件,你要的什么信息都有了。

#3


ActiveX 不方便保存在本地, 要在内存完成

#4


GetObject.

#5


具体一些?

#6


引用 4 楼 laviewpbt 的回复:
GetObject.

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Const OBJ_BITMAP = 7
Private Type BITMAP '14 bytes
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
End Type

Sub GetBmpInfo()
    Dim bmp As BITMAP
    
    GetObject Me.Picture.Handle, Len(bmp), bmp
End Sub
BITMAP结构里已包含图像的所有信息了。

#7


引用 4 楼 laviewpbt 的回复:
GetObject.

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Type BITMAP '14 bytes
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
End Type

Sub GetBmpInfo()
    Dim bmp As BITMAP
    
    GetObject Me.Picture.Handle, Len(bmp), bmp
End Sub
BITMAP结构里已包含图像的所有信息了。

#8


你只获得了像素的数据,当然没有头了。

#9


引用 6 楼 lyserver 的回复:
引用 4 楼 laviewpbt 的回复:

GetObject. 

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long 
Private Const OBJ_BITMAP = 7 
Private Type BITMAP '14 bytes 
        bmType As Long 
        bmWidth As Long 
        bmHeight As Long 
        bmWidthBytes As Long 
        bmPlanes As Integer 
        bmBitsPixel As …


这个是头信息 
我想要的是完整的数据流, 就跟从文件打开一样的(信息头+数据) ,一个完整的流 不是分开的

#10


引用 8 楼 chenjl1031 的回复:
你只获得了像素的数据,当然没有头了。


是的, 我不是说用GetBitmapBits获取所有, 其他方法的只要能取到所有数据就可以

#11


要完整的数据流就不要用GetBitmapBits,图像在内存中文件头头信息和图像数据本来就不是依顺序存放的,要流的话用GDI+  Savetostream函数

#12


引用 11 楼 laviewpbt 的回复:
要完整的数据流就不要用GetBitmapBits,图像在内存中文件头头信息和图像数据本来就不是依顺序存放的,要流的话用GDI+  Savetostream函数

vb里面可以用吗? 查了查都是delphi在用这个函数

#13


我认为大家都考虑多了,二进制流数据直接放到一个byte数组就行了,有多少放多少,原汁原味,不必那么麻烦

#14


引用 13 楼 SYSSZ 的回复:
我认为大家都考虑多了,二进制流数据直接放到一个byte数组就行了,有多少放多少,原汁原味,不必那么麻烦


我用过这个方法
    Dim tmpPic As Picture
    Set tmpPic = CaptureWindow(hWndActive, False, x, y, x + w, y + h) '获取图片
    Dim PBag As New PropertyBag
    Dim B() As Byte
    PBag.WriteProperty "Picture", tmpPic '读取tmpPicture 图片并写到 Pbag 容器中
    
    B = PBag.Contents '获取容器Byte 到 B() 数组中
    Set PBag = Nothing

不过得到的数组B 好像不对 大小比通过GetBitmapBits得到的数组还小 , 而且在C#里面不能转换成图片

#15


我试了一下,
 Dim PBag As New PropertyBag 
    Dim B() As Byte 
    PBag.WriteProperty "Picture", tmpPic '读取tmpPicture 图片并写到 Pbag 容器中 
    
    B = PBag.Contents '获取容器Byte 到 B() 数组中 
得到的数据已不是原来的数据,就在本程序段已不能加载为图片

#16


难道必须保存成文件再读取才能得到二进制流?

#17


这个函数已经是Windows遗弃的孤儿了,应该用更先进的函数GetDIBits,它的第6个参数lpbi接受bitmap的头信息结构指针(需要自己先填充,因为不同类型的bitmap,取得的数据是不同的)。然后连同这个结构和取得的数据,在加上14字节的文件头,就是一个完整的.bmp磁盘位图文件了。