关于摄像头截图存入内存并发送至服务器 100分

时间:2022-09-17 20:03:42
现有类cam.vb,窗体From1.vb
现在我想在From1中用buttun来截图保存进内存并发送至服务器
视频已经显示出来了,在PictureBox1里,请问红色的地方该怎么写
并且怎么用Sockets来进行数据发送,谢谢

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Bmp As Image

        Bmp = ??????/(PicBox, New RectangleF(0, 0, PictureBox1.Width, PictureBox1.Height))
     
   Dim ms As New MemoryStream()
        Bmp.Save(ms, Imaging.ImageFormat.Jpeg) 'Change the format so we can pass a smaller image
        Dim Img As Image = Image.FromStream(ms)

        Thread.Sleep(1000 / 30) 'Decreasing the time the calculation were taken (So each frame delay will be true)
        Dim writer As New IO.StreamWriter(client.GetStream)
        writer.Write(ms)
        writer.Flush()

    End Sub

cam.vb代码入下

Imports System
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Net.Sockets

Public Class Cam
#Region "Api's and costants"
    Private Const WM_USER As Integer = &H400
    Private Const WS_CHILD As Integer = &H40000000
    Private Const WS_VISIBLE As Integer = &H10000000
    Private Const WM_CAP_START As Integer = WM_USER
    Private Const WM_CAP_STOP As Integer = WM_CAP_START + 68
    Private Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP_START + 10
    Private Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP_START + 11
    Private Const WM_CAP_SAVEDIB As Integer = WM_CAP_START + 25
    Private Const WM_CAP_GRAB_FRAME As Integer = WM_CAP_START + 60
    Private Const WM_CAP_SEQUENCE As Integer = WM_CAP_START + 62
    Private Const WM_CAP_FILE_SET_CAPTURE_FILEA As Integer = WM_CAP_START + 20
    Private Const WM_CAP_SEQUENCE_NOFILE As Integer = WM_CAP_START + 63
    Private Const WM_CAP_SET_OVERLAY As Integer = WM_CAP_START + 51
    Private Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
    Private Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Integer = WM_CAP_START + 6
    Private Const WM_CAP_SET_CALLBACK_ERROR As Integer = WM_CAP_START + 2
    Private Const WM_CAP_SET_CALLBACK_STATUSA As Integer = WM_CAP_START + 3
    Private Const WM_CAP_SET_CALLBACK_FRAME As Integer = WM_CAP_START + 5
    Private Const WM_CAP_SET_SCALE As Integer = WM_CAP_START + 53
    Private Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP_START + 52

    Public Const WM_CAP_GET_CAPSTREAMPTR = WM_CAP_START + 1

    Public Const WM_CAP_SET_CALLBACK_STATUS = WM_CAP_START + 3
    Public Const WM_CAP_SET_CALLBACK_YIELD = WM_CAP_START + 4
    Public Const WM_CAP_SET_CALLBACK_WAVESTREAM = WM_CAP_START + 7
    Public Const WM_CAP_GET_USER_DATA = WM_CAP_START + 8
    Public Const WM_CAP_SET_USER_DATA = WM_CAP_START + 9

    Public Const WM_CAP_DRIVER_GET_NAME = WM_CAP_START + 12
    Public Const WM_CAP_DRIVER_GET_VERSION = WM_CAP_START + 13
    Public Const WM_CAP_DRIVER_GET_CAPS = WM_CAP_START + 14

    Public Const WM_CAP_FILE_SET_CAPTURE_FILE = WM_CAP_START + 20
    Public Const WM_CAP_FILE_GET_CAPTURE_FILE = WM_CAP_START + 21
    Public Const WM_CAP_FILE_ALLOCATE = WM_CAP_START + 22
    Public Const WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
    Public Const WM_CAP_FILE_SET_INFOCHUNK = WM_CAP_START + 24
    Public Const WM_CAP_FILE_SAVEDIB = WM_CAP_START + 25

    Public Const WM_CAP_EDIT_COPY = WM_CAP_START + 30

    Public Const WM_CAP_SET_AUDIOFORMAT = WM_CAP_START + 35
    Public Const WM_CAP_GET_AUDIOFORMAT = WM_CAP_START + 36

    Public Const WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41
    Public Const WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42
    Public Const WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43
    Public Const WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44
    Public Const WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45
    Public Const WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46

    Public Const WM_CAP_GET_STATUS = WM_CAP_START + 54
    Public Const WM_CAP_SET_SCROLL = WM_CAP_START + 55

    Public Const WM_CAP_GRAB_FRAME_NOSTOP = WM_CAP_START + 61

    Public Const WM_CAP_SET_SEQUENCE_SETUP = WM_CAP_START + 64
    Public Const WM_CAP_GET_SEQUENCE_SETUP = WM_CAP_START + 65
    Public Const WM_CAP_SET_MCI_DEVICE = WM_CAP_START + 66
    Public Const WM_CAP_GET_MCI_DEVICE = WM_CAP_START + 67
    Public Const WM_CAP_ABORT = WM_CAP_START + 69

    Public Const WM_CAP_SINGLE_FRAME_OPEN = WM_CAP_START + 70
    Public Const WM_CAP_SINGLE_FRAME_CLOSE = WM_CAP_START + 71
    Public Const WM_CAP_SINGLE_FRAME = WM_CAP_START + 72

    Public Const WM_CAP_PAL_OPEN = WM_CAP_START + 80
    Public Const WM_CAP_PAL_SAVE = WM_CAP_START + 81
    Public Const WM_CAP_PAL_PASTE = WM_CAP_START + 82
    Public Const WM_CAP_PAL_AUTOCREATE = WM_CAP_START + 83
    Public Const WM_CAP_PAL_MANUALCREATE = WM_CAP_START + 84

    '// Following added post VFW 1.1
    Public Const WM_CAP_SET_CALLBACK_CAPCONTROL = WM_CAP_START + 85

    '// Defines end of the message range
    Public Const WM_CAP_END = WM_CAP_SET_CALLBACK_CAPCONTROL
#End Region
    Private hWndC As IntPtr
    Private bStat As Boolean = False

    Private mControlPtr As IntPtr
    Public mWidth As Integer
    Public mHeight As Integer
    Public mLeft As Integer
    Public mTop As Integer
    Public Running As Boolean
    Public CamFrameRate As Integer = 30
    Dim lpszName(99) As Byte
    Dim Cam As Cam
    Dim OutputHeight As Integer = 240
    Dim OutputWidth As Integer = 360
    Dim PicBox As PictureBox
    Dim netStream As NetworkStream


    <DllImport("avicap32.dll")> _
    Private Shared Function capCreateCaptureWindowA(ByVal lpszWindowName() As Byte, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWndParent As IntPtr, ByVal nID As Integer) As IntPtr
    End Function

    <DllImport("avicap32.dll")> _
    Private Shared Function capGetVideoFormat(ByVal hWnd As IntPtr, ByVal psVideoFormat As IntPtr, ByVal wSize As Integer) As Integer
    End Function

    <DllImport("User32.dll")> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Long) As Boolean
    End Function
    Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Int32) As Boolean
    Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Integer) As Boolean


    Function capDlgVideoFormat() As Boolean
        capDlgVideoFormat = SendMessage(hWndC, WM_CAP_DLG_VIDEOFORMAT, 0, 0)
    End Function
    Function capDlgVideoSource() As Boolean
        capDlgVideoSource = SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0)
    End Function
    Function capDlgVideoDisplay() As Boolean
        capDlgVideoDisplay = SendMessage(hWndC, WM_CAP_DLG_VIDEODISPLAY, 0, 0)
    End Function
    Function capDlgVideoCompression() As Boolean
        capDlgVideoCompression = SendMessage(hWndC, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0)
    End Function




    '接上节

    '/// <summary>
    '/// 初始化摄像头
    '/// </summary>
    '/// <param name="handle">控件的句柄</param>
    '/// <param name="left">开始显示的左边距</param>
    '/// <param name="top">开始显示的上边距</param>
    '/// <param name="width">要显示的宽度</param>
    '/// <param name="height">要显示的长度</param>
    Public Sub New(ByVal handle As IntPtr, ByVal left As Integer, ByVal top As Integer, ByVal width As Integer, ByVal height As Integer)
        mControlPtr = handle
        mWidth = width
        mHeight = height
        mLeft = left
        mTop = top
    End Sub

    '/// <summary>
    '/// 开始显示图像
    '/// </summary>
    Public Sub Start()
        If bStat Then
            Return
        End If
        bStat = True
        Dim lpszName(99) As Byte

        hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD Or WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0)

        If hWndC.ToInt32() <> 0 Then
            SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)
            SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0)
            SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)
            SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)
            SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0)
            SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0)
            SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0)
            SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0)
        End If

        Return
    End Sub

    '/// <summary>
    '/// 停止显示
    '/// </summary>
    Public Sub [Stop]()
        SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
        bStat = False
    End Sub

    '/// <summary>
    '/// 抓图
    '/// </summary>
    '/// <param name="path">要保存bmp文件的路径</param>
    Public Sub GrabImage()
        Dim hBmp As IntPtr
        SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64())
    End Sub

    '/// <summary>
    '/// 录像
    '/// </summary>
    '/// <param name="path">要保存avi文件的路径</param>
    Public Sub Kinescope(ByVal path As String)

        Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
        SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64())
        SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0)

    End Sub

    '/// <summary>
    '/// 停止录像
    '/// </summary>
    Public Sub StopKinescope()
        SendMessage(hWndC, WM_CAP_STOP, 0, 0)
    End Sub

End Class



6 个解决方案

#1


怎么连个看的人都没有啊,嫌分少?

#2


在线坐等啊

#3


怎么这版块没人了么

#4


坐等高手解答~,不过用socket是不是先把那啥图片转成bytes呢~

#5


坐等高手解答啊

#6


        我这样改了一下,效果还行,不过还是转了个弯....    
/// <summary>
            /// 抓图到内存
            /// </summary>
            /// <param name="path"></param>
            public Image  GrabImage()
            {
                SendMessage(hWndC, WM_CAP_EDIT_COPY, 0,0);
                IDataObject obj1 = Clipboard.GetDataObject();
                if (obj1.GetDataPresent(typeof(Bitmap)))
                {
                  return (Image)obj1.GetData(typeof(Bitmap));
                }
                return null;
            }

#1


怎么连个看的人都没有啊,嫌分少?

#2


在线坐等啊

#3


怎么这版块没人了么

#4


坐等高手解答~,不过用socket是不是先把那啥图片转成bytes呢~

#5


坐等高手解答啊

#6


        我这样改了一下,效果还行,不过还是转了个弯....    
/// <summary>
            /// 抓图到内存
            /// </summary>
            /// <param name="path"></param>
            public Image  GrabImage()
            {
                SendMessage(hWndC, WM_CAP_EDIT_COPY, 0,0);
                IDataObject obj1 = Clipboard.GetDataObject();
                if (obj1.GetDataPresent(typeof(Bitmap)))
                {
                  return (Image)obj1.GetData(typeof(Bitmap));
                }
                return null;
            }