IP Kamera Livebilder auf Festplatte speichern "Snapshot"

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    IP Kamera Livebilder auf Festplatte speichern "Snapshot"

    Hallo Zusammen ich mal wieder.... ?(

    Ich habe eine IP Kamera mit der ich über VB ein Livebild dargestellt bekomme. Nun möchte ich gerne mit einem Button das aktive Bild abspeicher auf meiner Festplatte. Anderes gesagt ein Screenshot / Snapshot. Zusätzlich möchte ich eine Anzeige des aktuell aufgenommen Bildes haben. In meinem Code speichert VB allerdings immer nur ein schwarzes Bild, Grösse stimmt aber.

    Wäre nett wenn mal jemand bei Gelegenheit drüber gucken könnte und vielleicht einen Tip hat.

    Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim webWidth As Integer = WebBrowser1.Width
    3. Dim webHeight As Integer = WebBrowser1.Height
    4. Dim result As Boolean
    5. Dim webHwnd As Long
    6. webHwnd = WebBrowser1.Handle
    7. Dim bitDest As New Bitmap(webWidth, webHeight)
    8. Dim g As Graphics
    9. g = Graphics.FromImage(bitDest)
    10. Dim hdc As Long
    11. hdc = g.GetHdc()
    12. result = PrintWindow(webHwnd, hdc, 0)
    13. g.ReleaseHdc(hdc)
    14. g.Flush()
    15. If result Then
    16. PictureBox1.Image = bitDest
    17. bitDest.Save("ZWSpeicher/Nachsichtkamera1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    18. End If
    19. End Sub


    Danke für Eure Hilfe und Tips.
    Morgen @Otti, probier es mal so.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. ''' <summary>
    5. ''' Importieren der gdi32.dll und deren Funktion BitBlt(+9)
    6. ''' </summary>
    7. ''' <returns>IntPtr</returns>
    8. ''' <remarks></remarks>
    9. <DllImport("gdi32.DLL", EntryPoint:="BitBlt", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    10. Private Shared Function BitBlt(ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, _
    11. ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Integer) As Boolean
    12. End Function
    13. ''' <summary>
    14. ''' Erzeugt ein Imageobjekt aus dem übergebenen Graphicsobjekt
    15. ''' </summary>
    16. ''' <returns>Image</returns>
    17. ''' <remarks></remarks>
    18. Private Function ImageFromGraphics(ByVal Graphics As Graphics, ByVal Bounds As Rectangle) As Image
    19. Dim img As Bitmap = New Bitmap(Bounds.Width, Bounds.Height, Graphics)
    20. Dim gp As Graphics = Graphics.FromImage(img)
    21. Dim dcOne As IntPtr = Graphics.GetHdc()
    22. Dim dcTwo As IntPtr = gp.GetHdc()
    23. BitBlt(dcTwo, 0, 0, Bounds.Width, Bounds.Height, dcOne, 0, 0, 13369376)
    24. Graphics.ReleaseHdc(dcOne)
    25. gp.ReleaseHdc(dcTwo)
    26. Return img
    27. End Function
    28. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    29. WebBrowser1.Navigate("http://google.de")
    30. End Sub
    31. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    32. Dim img As Image = ImageFromGraphics(WebBrowser1.CreateGraphics, New Rectangle(0, 0, WebBrowser1.Width, WebBrowser1.Height))
    33. PictureBox1.Image = img
    34. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    35. End Sub
    36. End Class

    Otti schrieb:

    In meinem Code speichert VB allerdings immer nur ein schwarzes Bild,
    Das kommt daher, dass der Kamera-Treiber das Bild direkt in die Grafikkarte einspeist. Das Image-Control Deiner Form dient nur als Platzhalter.
    Wenn Du ein Bild speichern willst, musst Du direkt über die Kamerasoftware gehen, lies Dich da mal ein oder frage / suche gezielt nach entsprechenden Programmen / Quellen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich nehme an, die IP Kamera sendet nur einen JPEG-Stream? Dann wäre das AForge Framework etwas für dich.
    Damit kannst du dich auf einen Stream aufschalten und bekommst die Bilder via Event.

    C-Quellcode

    1. var test = new MJPEGStream("http://irgendeine.url/test");
    2. test.NewFrame += device_NewFrame;
    3. test.Start();
    4. void device_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
    5. {
    6. // eventArgs.Frame beinhaltet das Bild
    7. }

    Visual Basic-Quellcode

    1. Dim test = New MJPEGStream("http://irgendeine.url/test")
    2. AddHandler test.NewFrame, AddressOf device_newFrame
    3. test.Start()
    4. Sub device_newFrame(sender As Object, eventArgs as AForge.Video.NewFrameEventArgs)
    5. ' eventArgs.Frame beinhaltet das Bild
    6. End Sub

    Moin LaMiy

    Habe deinen Code mal versucht zu übernehmen, teilweise klappt es, VB erstellt ein Bild allerdings nicht vom Webbrowser sondern von der Umgebung wo sich der Button befindet. Desweiteren macht VB , Bilder in Bild wenn ich mehrmals auf den "Button" klicke.

    Moin AliveDevil

    Stehe auf dem Schlauch bin nicht der Experte in VB programmieren, bekomme deine Idee nicht wirklich in meinen vorhanden Code eingebunden. könntest du mir evt. sagen wie und wo das ich das besser verstehe.
    Danke
    @Otti verstehe zunächst dies:

    RodFromGermany schrieb:

    Das kommt daher, dass der Kamera-Treiber das Bild direkt in die Grafikkarte einspeist. Das Image-Control Deiner Form dient nur als Platzhalter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Otti schrieb:

    aber wer sagt mir
    Deine Problembeschreibung.
    Mach mal von so einem Bild einen System-ScreenShot.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann sollte es mit einem eigenen Programm genau so funktionieren. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Otti schrieb:

    nur noch die Frage wie
    Probier mal dies. Form mit 2 Button, TextBox, WebBrowser

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Me.WebBrowser1.Navigate(Me.TextBox1.Text)
    4. End Sub
    5. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    6. Dim sz As Size = Me.WebBrowser1.Size
    7. Dim img = New Bitmap(sz.Width, sz.Height)
    8. Dim gr As Graphics = Graphics.FromImage(img)
    9. Dim pt = Me.PointToScreen(Me.WebBrowser1.Location) ' hier wird der obere linke Punkt Deines Controls in Screen-Koordinaten umgerechnet
    10. Dim x = pt.X
    11. Dim y = pt.Y
    12. gr.CopyFromScreen(X, Y, 0, 0, sz)
    13. img.Save("c:\Temp\test.png", Imaging.ImageFormat.Png)
    14. End Sub
    15. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Otti schrieb:

    allerdings nicht nur von dem Webbrowser sondern von der Form mit Button und Textfeld.
    Bei mir macht exakt dieser Code diese Bilder:
    Bilder
    • Copy.png

      118,61 kB, 692×784, 158 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Otti
    benutze bitte "Erweiterte Antwort" => Dateianhänge
    und poste bitte Deinen Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Me.WebBrowser1.Navigate(Me.TextBox1.Text)
    4. End Sub
    5. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    6. Dim sz As Size = Me.WebBrowser1.Size
    7. Dim img = New Bitmap(sz.Width, sz.Height)
    8. Dim gr As Graphics = Graphics.FromImage(img)
    9. Dim pt = Me.PointToScreen(Me.WebBrowser1.Location)
    10. Dim x = pt.X
    11. Dim y = pt.Y
    12. gr.CopyFromScreen(X, Y, 0, 0, sz)
    13. img.Save("c:\test.jpg", Imaging.ImageFormat.Jpeg)
    14. End Sub
    15. End Class
    Bilder
    • test.PNG

      141,51 kB, 1.094×475, 146 mal angesehen

    Otti schrieb:

    VB.NET-Quellcode

    1. img.Save("c:\test.jpg", Imaging.ImageFormat.Jpeg)
    macht exakt was es soll.
    Du hast allerdings ainen anderen Pfad drin. Siehst Du Dir das falsche Bild an?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!