现在我把截屏下来的数据保存在了数组中。
但由于其是BMP格式的,很大,2兆多,如果直接发送这个数组的话耗时太长。
所以就考虑是不是可以用GdipSaveImageToStream在内存中将其压缩。
研究了半天这个GdipSaveImageToStream函数不会用。还请哪位大侠给个代码。多谢了。
但由于其是BMP格式的,很大,2兆多,如果直接发送这个数组的话耗时太长。
所以就考虑是不是可以用GdipSaveImageToStream在内存中将其压缩。
研究了半天这个GdipSaveImageToStream函数不会用。还请哪位大侠给个代码。多谢了。
CLSIDFromString
GdipGetImageEncodersSize
CreateStreamOnHGlobal
GdipCreateBitmapFromHBITMAP
GdipDrawImageRect
GdipSaveImageToStream
GdipDisposeImage
GdipDeleteGraphics
转换为JPG的话能把2M多的转换成100K左右。根据原始图像的大小而或大或小。
sk,我就是不会用GdipSaveImageToStream这个函数啊
laviewpbt 你给的这个例子代码好多能不能有个单独的调用GdipSaveImageToStream的例子。我看那个代码看得眼花瞭乱的
就是,我现在已经把捕获的bmp位图流保存了数组中,相关代码:
GetBitmapBits mBitmap, UBound(PicBits), PicBits(1)
这个picbits就保存着位图的数据,如果直接传输picbits的话是可以正常显示的,但是因为太大,需要2-3秒才能传完。所以麻烦给一个把picbits数据压缩的代码。别给我那么多代码啊,我非常菜,看那么多代码看不懂。
多谢大家的关注。
在使用 GdipSaveImageToStream 之前,先学会使用
CLSIDFromString
GdipGetImageEncodersSize
CreateStreamOnHGlobal
GdipCreateBitmapFromHBITMAP
GdipDrawImageRect
在上面我连使用顺序我都帮你排好了,当你使用完上面这些函数,
GdipSaveImageToStream 需要的参数也自然都具备了。
那些它前面的函数是GDI+的,包括什么设置参数,初始化解码器,GUID之类的。对吧?
然后我到了GdipSaveImageToStream 这个函数的时候,该怎么传递参数,就不懂了。我看了laviewpbt给我的代码,好像不是直接对前面的那个BMP流直接处理。其中还用了2个过程,那2个过程我看不懂
ReDim PicDataByteArray(DataSize)
FileAddr = ByteArrayToStream(PicDataByteArray)
Call GdipCreateBitmapFromHBITMAP(mvarhBitmap, 0, mvarhImage)
Call GdipDrawImageRect(mvarhGraphics, mvarhImage, 0, 0, mvarsWidth, mvarsHeight)
Call GdipSaveImageToStream(mvarhImage, FileAddr, tJpgEncoder, aEncParams(1))
Call GdipDisposeImage(mvarhImage)
Call GdipDeleteGraphics(mvarhGraphics)
1、得到你要转换的位图句柄,这个是GDI的应用就可以了
2、取得你要使用的编码器句柄
3、定义一个数组,用来装转换后的JPG数据
4、分配你的数组大小
5、取得你数组的Stream句柄,用CreateStreamOnHGlobal
6、开始GDI+的处理过程了,主要是通过位图句柄取得GDI+的hImage句柄来开展的
Call GdipCreateBitmapFromHBITMAP(mvarhBitmap, 0, mvarhImage)
7、Call GdipDrawImageRect(mvarhGraphics, mvarhImage, 0, 0, mvarsWidth, mvarsHeight)
8、Call GdipSaveImageToStream(mvarhImage, FileAddr, tJpgEncoder, aEncParams(1))
9、Call GdipDisposeImage(mvarhImage)
10、Call GdipDeleteGraphics(mvarhGraphics)
这时候第三步定义的数组中就是你要的JPG数据了
FileAddr = ByteArrayToStream(PicDataByteArray)FileAddr就是得到的Stream句柄
函数如下:
Public Function ByteArrayToStream(ByRef b() As Byte) As Long
On Error Resume next
CreateStreamOnHGlobal b(0), True, ByteArrayToStream
End Function