我测试了一下,程序唯一显得慢的地方就是服务器端抓图的时候卡一下,如果把抓图的代码换一下,如直接读取图片,速度就好多了。不知道还能怎样提高抓图的速度?下面是代码下载地址:
http://www.rljy.com/Item/CodeDownload/Default.asp?NowMenuID=2&LMenu=45&LClass=56&Code=90

解决方案 »

  1.   

    下了,很多地方需要改进
    1。首先,抓图后通过 保存 为 bmp 再 通过 dll 转换 为 jpg ,再读入文件到 数组进行传送
    这个做法是最烂最不可取的做法,额外的消耗了磁盘读取,转换图片等操作
    2。抓图后 抓图设备 没有释放,数组也没有显式释放,导致 才5秒就吃掉了我100多兆内存暂时看到这里,感觉上代码没什么可取之处
      

  2.   

    按照我的改造
    改为抓图后先将图片数组压缩,通过xceed zip 提供的字节数组压缩功能(当然,也有直接用VB压缩字节的代码,不过速度太慢)在内存中压缩,然后直接发送出去,没有必要转换成jpg
    至于图片质量,可以直接在抓图时控制
    客户端接收后不必释放到磁盘,直接解压缩数组,再读取为位图显示即可,也省去了解码jpg的操作
      

  3.   

    问题是速度不是卡在压缩图片的过程中,而是抓图的过程呀,
    只要一使用Bitblt抓图,系统就像死机一样停顿一下,而且
    这还与抓图的大小有关,如果抓取640*480那就很流畅,如果
    抓取的是1024*768那就会卡了,有什么更好的方法吗?在抓
    取1024*768的图片时不卡。我想过直接获得目标DC的位图句
    柄,然后再通过位图句柄转化出一个Picture类型的变量,
    但是这种做法行不通,因为通过桌面设备的位图句柄根本就
    不能获得需要的图片信息。
      

  4.   

    又要高质量,又要大,肯定不行
    抓取前设置好位图的色彩位,8bit,16bit,24bit默认是24bit
      

  5.   

    使用Bitblt或StretchBlt是不能设置色彩位的呀,难道说用GDI建立好16位或8位
    的设备场景再用Bitblt或StretchBlt将位图复制进此设备中就会又大又快了吗?
    如果使用GDI的设备,采用GetBitmapBits可能还快点,但是GetBitmapBits获取
    的色彩值好像是根据系统颜色获取的,就是说如果你的系统是32位色,他返回
    的也是32位形势的数组,如果是16位色,他返回的也是16位色的数组,好像不能
    自定义获取位图的颜色模式。
    其实压缩质量和网络传输方面可以有很多的解决方案能提高效率,但是就是这个
    抓图的过程我是想不出怎么能够更快的实现,因为原来的程序使用PictureBox作
    为抓图的设备,所以我以为是这个设备问题影响的速度,但是当我完全用API实现
    整个设备位图的创建及复制图片时发现,抓图的过程还是很慢。
    楼上这位兄弟,看了你的那么多说法,不知你可否实现提高抓图速度这个问题呢?
    如果可以,说说看嘛,你是怎么实现的呀。
      

  6.   

    http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx
      

  7.   

    位图是色彩位可以在位图结构中设置的
    请看下面关于位图的说明,对于低色彩位图,本身是不能提高抓图速度,但是可以减少内存占用,减少网络传输时间,从而提高速度BMP文件结构   1. BMP文件组成 
      BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。   2. BMP文件头 
      BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。   其结构定义如下:typedef struct tagBITMAPFILEHEADER
    {
    WORDbfType; // 位图文件的类型,必须为BM
    DWORD bfSize; // 位图文件的大小,以字节为单位
    WORDbfReserved1; // 位图文件保留字,必须为0
    WORDbfReserved2; // 位图文件保留字,必须为0
    DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
    // 文件头的偏移量表示,以字节为单位
    } BITMAPFILEHEADER;  3. 位图信息头
      BMP位图信息头数据用于说明位图的尺寸等信息。
    typedef struct tagBITMAPINFOHEADER{
    DWORD biSize; // 本结构所占用字节数
    LONGbiWidth; // 位图的宽度,以像素为单位
    LONGbiHeight; // 位图的高度,以像素为单位
    WORD biPlanes; // 目标设备的级别,必须为1
    WORD biBitCount// 每个像素所需的位数,必须是1(双色),
    // 4(16色),8(256色)或24(真彩色)之一
    DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
    // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    DWORD biSizeImage; // 位图的大小,以字节为单位
    LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数
    LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数
    DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
    DWORD biClrImportant;// 位图显示过程中重要的颜色数
    } BITMAPINFOHEADER;  4. 颜色表 
      颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:typedef struct tagRGBQUAD {
    BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
    BYTErgbGreen; // 绿色的亮度(值范围为0-255)
    BYTErgbRed; // 红色的亮度(值范围为0-255)
    BYTErgbReserved;// 保留,必须为0
    } RGBQUAD;
    颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
    当biBitCount=1,4,8时,分别有2,16,256个表项;
    当biBitCount=24时,没有颜色表项。
    位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
    typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader; // 位图信息头
    RGBQUAD bmiColors[1]; // 颜色表
    } BITMAPINFO;
      5. 位图数据 
      位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数: 
      当biBitCount=1时,8个像素占1个字节;
      当biBitCount=4时,2个像素占1个字节;
      当biBitCount=8时,1个像素占1个字节;
      当biBitCount=24时,1个像素占3个字节;  Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,一个扫描行所占的字节数计算方法:DataSizePerLine= (biWidth* biBitCount+31)/8;
    // 一个扫描行所占的字节数
    DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数
    位图数据的大小(不压缩情况下):
    DataSize= DataSizePerLine* biHeight;
      

  8.   

    vb 中的声明如下
    '
    Private Const BI_RGB = 0&
    Private Const DIB_RGB_COLORS = 0 '  color table in RGBs
    Private Type BITMAPINFOHEADER '40 bytes
            biSize As Long
            biWidth As Long
            biHeight As Long
            biPlanes As Integer
            biBitCount As Integer
            biCompression As Long
            biSizeImage As Long
            biXPelsPerMeter As Long
            biYPelsPerMeter As Long
            biClrUsed As Long
            biClrImportant As Long
    End Type
    Private Type RGBQUAD
            rgbBlue As Byte
            rgbGreen As Byte
            rgbRed As Byte
            rgbReserved As Byte
    End Type
    Private Type BITMAPINFO
            bmiHeader As BITMAPINFOHEADER
            bmiColors As RGBQUAD
    End Type
    Private Type iRGB   'THIS IS NOT PART OF THE WINDOWS API. I CREATED THIS MYSELF. ALTHOUGH IT CAN BE REPLACED WITH RGBTRIBLE i just discovered which is a littlebit different
        iR As Byte
        iG As Byte
        iB As Byte
    End TypeDim bi24BitInfo As BITMAPINFO
      

  9.   

    不过我已经找到了替代 GID32 中 Bitblt或StretchBlt 抓图的方案
    即 微软的视频扩展 msvfw32.dll 中的 drawDib
    比  Bitblt或StretchBlt 
     1)显示速度快; 2) 内存占用少; 3) 缩放显示时图形失真小,4) 在低颜色位数的设备上显示高颜色位数的图形图形时失真小; 5) 通过直接处理位图数据,可以制作简单动画。你可以上 msdn 下载相关 SDK
    一些基本的声明如下
    Private Declare Function DrawDibOpen Lib "msvfw32.dll" () As Long
    'extern BOOL VFWAPI DrawDibClose(HDRAWDIB hdd);
    Private Declare Function DrawDibClose Lib "msvfw32.dll" (ByVal hDD As Long) As Long
    'extern BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd,
    '                                   HDC      hdc,
    '                                   int      xDst,
    '                                   int      yDst,
    '                                   int      dxDst,
    '                                   int      dyDst,
    '                                   LPBITMAPINFOHEADER lpbi,
    '                                   LPVOID   lpBits,
    '                                   int      xSrc,
    '                                   int      ySrc,
    '                                   int      dxSrc,
    '                                   int      dySrc,
    '                                   UINT     wFlags);
    Private Declare Function DrawDibDraw Lib "msvfw32.dll" (ByVal hDD As Long, ByVal hdc As Long, _
          ByVal xDst As Long, ByVal yDst As Long, ByVal dxDst As Long, ByVal dyDst As Long, _
          lpBI As Any, lpBits As Any, _
          ByVal xSrc As Long, ByVal ySrc As Long, ByVal dxSrc As Long, ByVal dySrc As Long, _
          ByVal wFlags As Long) As Long
      

  10.   

    其实我原来也看过几个这样的程序,还有的采用的流媒体技术,但是没有一
    个快的,原因都是抓图的时候拖慢速度,至于什么压缩呀或质量呀都不是什
    么问题。如果你把原来的代码里抓图的过程改为一个
    LoadPicture("C:\1024×768.bmp")都不会这样。因为起码用了Doevents就不
    会影响鼠标的运动。一用抓图,系统的所有资源好像全部被暂停一样,所以
    才卡。楼上的你可以将原来的代码改一下试试看吗?看在抓图的时候还会不
    会卡。我很期待呀。
      

  11.   

    客户机上直接抓图,以JPG格式传送到主机速度会提高很多的~
      

  12.   

    回复人: kmlxk(xiaoKKKK) ( ) 信誉:100  2005-09-24 22:43:00  得分: 0  
     
     
       很有特色啊,中文函数名、变量名~
      
     
    再顶~~~~~~~~~~~~~~~~~~
      

  13.   

    原因都是抓图的时候拖慢速度
    =================================
    ??????????????
    我不明白,为什么抓图会慢,我在这边单机测试很快
    如果不考虑写入磁盘,压缩等情况下,60 帧只需要0.18秒(1024×768×16bitcolor)
      

  14.   

    主要代码如下
    Dim II As Long
    Dim t As Single
    Dim deskDC As Long
    Dim cX As Long, cY As Long
    cX = Screen.Width \ Screen.TwipsPerPixelX
    cY = Screen.Height \ Screen.TwipsPerPixelY
    deskDC = GetWindowDC(GetDesktopWindow)
    t = Timer
    For II = 1 To 60
        Picture1.Cls
        StretchBlt Picture1.hdc, 0, 0, cX, cY, deskDC, 0, 0, cX, cY, vbSrcCopy
        DoEvents
    Next
    MsgBox Timer - t
      

  15.   

    楼上的兄弟能把代码改改,发一个来看看吗?
    [email protected]
      

  16.   

    经过测试,我发现 用 BitBlt 在某些机器上比用  StretchBlt 慢很多,估计和显卡情况有关公司的电脑 p4 2.4G 板自带显卡,使用 bitblt 比使用  StretchBlt  慢 上100 微秒/次
    家里的电脑 赛扬1G,GF400 显卡,使用速度就差不多
    不知其他人有没有同样情况
      

  17.   

    我写了一个测试代码放在blog 上,欢迎测试
    http://blog.csdn.net/zlt982001/archive/2005/09/27/490378.aspx
      

  18.   

    我csdn 的blog 挂掉了,请访问这个
    http://zlt98.cnblogs.com/archive/2005/09/27/245447.html
    csdn 的博客真是超级烂,提交老提交不上,提交上了首页就变乱了,想写东西都没心情了
      

  19.   

    谢谢,得了个好东西,不过我TestByBitBlt的速度等的好久,呵呵,机子太滥了。
    我先看看把cDIBSection类用到程序里如何,我估计还是会卡。
      

  20.   

    发过来看看呀,谢谢!
    [email protected]