现在我把截屏下来的数据保存在了数组中。
但由于其是BMP格式的,很大,2兆多,如果直接发送这个数组的话耗时太长。
所以就考虑是不是可以用GdipSaveImageToStream在内存中将其压缩。
研究了半天这个GdipSaveImageToStream函数不会用。还请哪位大侠给个代码。多谢了。

解决方案 »

  1.   

    用Zlib压缩,需要的话,我有dll可以给你,留下邮箱
      

  2.   

    帮我顶下面这个贴,谢谢。。http://topic.csdn.net/u/20090730/17/1617709b-3ef8-4569-8183-5b2619f5f41e.html
      

  3.   

    Zlib压缩 是无损压缩,压缩BMP压缩率太低。http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=67466&lngWId=1 下载这个,然后你到源码里去找GdipSaveImageToStream这个函数在那个地方使用了,你就知道用法了。如果楼主是做广域网的屏幕传输,这个函数不具有实用性,因为他的计算时间在100ms以上。
      

  4.   

    JPG格式的比BMP的小的多,可否转换为JPG的?
      

  5.   

    关键函数
    CLSIDFromString
    GdipGetImageEncodersSize
    CreateStreamOnHGlobal
    GdipCreateBitmapFromHBITMAP
    GdipDrawImageRect
    GdipSaveImageToStream
    GdipDisposeImage
    GdipDeleteGraphics
      

  6.   

    dll文件还要多个文件太麻烦了点。
    转换为JPG的话能把2M多的转换成100K左右。根据原始图像的大小而或大或小。
    sk,我就是不会用GdipSaveImageToStream这个函数啊
    laviewpbt 你给的这个例子代码好多能不能有个单独的调用GdipSaveImageToStream的例子。我看那个代码看得眼花瞭乱的
    就是,我现在已经把捕获的bmp位图流保存了数组中,相关代码:
    GetBitmapBits mBitmap, UBound(PicBits), PicBits(1)
    这个picbits就保存着位图的数据,如果直接传输picbits的话是可以正常显示的,但是因为太大,需要2-3秒才能传完。所以麻烦给一个把picbits数据压缩的代码。别给我那么多代码啊,我非常菜,看那么多代码看不懂。
    多谢大家的关注。
      

  7.   

    或者其它压缩picbits数据流的也可以。
      

  8.   

    GdipSaveImageToStream 本身就不是独立使用的函数
    在使用 GdipSaveImageToStream 之前,先学会使用
    CLSIDFromString 
    GdipGetImageEncodersSize 
    CreateStreamOnHGlobal 
    GdipCreateBitmapFromHBITMAP 
    GdipDrawImageRect 
    在上面我连使用顺序我都帮你排好了,当你使用完上面这些函数,
    GdipSaveImageToStream 需要的参数也自然都具备了。
      

  9.   

    5555555,sk能不能给个GdipSaveImageToStream 的示例啊。小弟刚开始学它们。
    那些它前面的函数是GDI+的,包括什么设置参数,初始化解码器,GUID之类的。对吧?
    然后我到了GdipSaveImageToStream 这个函数的时候,该怎么传递参数,就不懂了。我看了laviewpbt给我的代码,好像不是直接对前面的那个BMP流直接处理。其中还用了2个过程,那2个过程我看不懂
      

  10.   

    既然你都到了使用 GdipSaveImageToStream 的地方了,那么你看这里就应该明白了   ...
       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)
      

  11.   

    工作原理及步骤:
    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数据了
      

  12.   

    '这个就是去你数组的Stream句柄的函数,是我自己写的
    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