我将视屏采集卡中的图像显示在PictureBox中,然后用
Picture1.AutoReDraw = True
VB.SavePicture Picture1.Image , "E:\pic.jpg"
结果保存的图片都是灰屏的,请问这个怎么解决?怎么将视屏保存为图片?保存后将此图片用Winsock发送,又出现的问题是:
1、如何用winsock一次传送大小为500K左右的图片呢?
2、怎么判断winsock连接的机器是远程还是本地的呢?
谢谢各位了:)

解决方案 »

  1.   

    //结果保存的图片都是灰屏的
    Picture1.AutoReDraw = True
    VB.SavePicture Picture1.Picture , "E:\pic.jpg"//1、如何用winsock一次传送大小为500K左右的图片呢?
    发送端分拆,接收端组合。用字节数组最方便和高效。//2、怎么判断winsock连接的机器是远程还是本地的呢?
    判断连接的IP地址和计算机名称是否和本地一致。
      

  2.   

    图片问题:
    >>以上代码好像没有问题,不过,你保存成jpg文件没有意义,因为SavePicture函数好像只支持BMP格式的图片文件保存。
    Winsock问题:
    >>1。你可以把保存的文件读出来,发送。不过,呵呵哈,这样效率低呢,最好直接在内存操作,不要保存到硬盘去。还有,最后先把图片转下格式,BMP格式太大了,发送会很慢的。另:好像我记得Winsock一次发送的数据量有限制?1kb还是?分批发出吧。
    >>2。我。。不知道怎么用Winsock判断。。那个东东功能不强。你可以用ws2_32.dll里的Socket系列函数。
      

  3.   

    视频采集卡它本身就携带一些dll文件,dll文件中一般都有保存图片的函数,直接调用既可。
    建议不要用 SavePicture来进行保存。
      

  4.   

    对,楼上说的对,如果用采集卡的话,会代有这样的函数,看看sdk中的例子!!
      

  5.   

    to ShellEx(全金属外壳) :
    那怎么在内存里面操作呢?能写个例子吗?
      

  6.   

    这。。我很久没用VB了,不大清楚VB有没有什么转图片格式的类可以用。不过C++的开源库到有满多,BCB可以直接用“流”进行图片格式转换和用Socket发送,很方便。
    VB我想,那几个GDI函数可以用吧
    CreateBitmap()可以创建个位图,但是忘记怎么把Vb的数据结构转换成void的指针了,不好意思,能力有限。:)
      

  7.   

    '在form上添加一个PictureBox,一个按钮(按下按钮保存图象)Dim Video_Handle As Long
    Private Sub Form_Load()
        Video_Handle = CreateCaptureWindow(PicCapture.hwnd)
    End SubPrivate Sub Command1_Click()
        Dim x As StdPicture
        Set x = CapturePicture(Video_Handle)
        SavePicture x, "c:\a.bmp"
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Disconnect Video_Handle
    End Sub'************模块************
    Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal nID As Long) As LongPrivate Const WS_CHILD = &H40000000
    Private Const WS_VISIBLE = &H10000000
    Private Const WM_USER = &H400
    Private Const WM_CAP_START = &H400
    Private Const WM_CAP_EDIT_COPY = (WM_CAP_START + 30)
    Private Const WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10)
    Private Const WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52)
    Private Const WM_CAP_SET_OVERLAY = (WM_CAP_START + 51)
    Private Const WM_CAP_SET_PREVIEW = (WM_CAP_START + 50)
    Private Const WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11)Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Preview_Handle As LongPublic Function CreateCaptureWindow(hWndParent As Long, Optional x As Long = 0, Optional y As Long = 0, Optional nWidth As Long = 320, Optional nHeight As Long = 240, Optional nCameraID As Long = 0) As Long  Preview_Handle = capCreateCaptureWindow("Video", WS_CHILD + WS_VISIBLE, x, y, nWidth, nHeight, hWndParent, 1)  SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, nCameraID, 0
      SendMessage Preview_Handle, WM_CAP_SET_PREVIEWRATE, 30, 0
      SendMessage Preview_Handle, WM_CAP_SET_OVERLAY, 1, 0
      SendMessage Preview_Handle, WM_CAP_SET_PREVIEW, 1, 0  CreateCaptureWindow = Preview_Handle
    End FunctionPublic Function CapturePicture(nCaptureHandle As Long) As StdPicture
      Clipboard.Clear
      SendMessage nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0
      Set CapturePicture = Clipboard.GetData
    End FunctionPublic Sub Disconnect(nCaptureHandle As Long, Optional nCameraID = 0)
      SendMessage nCaptureHandle, WM_CAP_DRIVER_DISCONNECT, nCameraID, 0
    End Sub