Elemente in Panel zum Bild erzeugen und speichern.

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Elemente in Panel zum Bild erzeugen und speichern.

    Folgendes, ich habe ein Programm erstellt welches ein Bild in Bild grafisch erstellt. Dies ist in einem Panel und besteht aus etwa 60 Pictureboxen und etwa 30 Labels. Somit kann man das "Bild in Bild" individuell anzeigen lassen. Jedoch müsste man dann ein Screenshot erstellen um an die erzeugte Grafik zu kommen.Gibt es eine möglichkeit der er vom Panel1 ein Bild machen (so wie es in dem Zeitpunkt ist) und man dieses dann abspeichern kann?(format ist egal)

    Ist das so überhaupt möglich?

    Gruß :)
    Allgemein würd ich dir empfehlen mit GDI+ aufne BitMap zu zeichnen, die kannst du ganz simpel speichern und GDI+ bietet dir mehr und es wird sauberer als mit Controls.

    Zur Frage: Du kannst einen Screenshot mit Graphics.FormScreen erzeugen.
    Das mit dem Screenshot lassen wir mal. BitBlt klappt perfekt

    VB.NET-Quellcode

    1. <DllImport("gdi32.dll")> _
    2. Private Shared Function BitBlt(ByVal hdc 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 Integer) As Boolean
    3. End Function
    4. Function GetImageFromControl(ByVal ctr As Control) As Image
    5. Dim rect As Rectangle = ctr.ClientRectangle
    6. Dim bmp As New Bitmap(rect.Width, rect.Height)
    7. Dim gbmp As Graphics = Graphics.FromImage(bmp)
    8. Dim hdcBmp As IntPtr = gbmp.GetHdc
    9. Dim gMe As Graphics = ctr.CreateGraphics
    10. Dim hdcMe As IntPtr = gMe.GetHdc
    11. BitBlt(hdcBmp, 0, 0, rect.Width, rect.Height, hdcMe, 0, 0, &Hcc0020)
    12. gbmp.ReleaseHdc(hdcBmp)
    13. gMe.ReleaseHdc(hdcMe)
    14. Return bmp
    15. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()

    @lulu297: Aus welchem Grund zitierst Du immer die Beiträge über Dir? Das ist hier im Forum nicht gewünscht.
    Sieh Dir mal dies an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <StructLayout(LayoutKind.Sequential)>
    4. Public Structure POINTAPI
    5. Public x As Integer
    6. Public y As Integer
    7. End Structure
    8. <DllImport("user32.dll")> _
    9. Public Shared Function ClientToScreen(ByVal hWnd As IntPtr, ByRef pt As POINTAPI) As Integer
    10. End Function
    11. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    12. Dim bmp As New Bitmap(Me.Width, Me.Height)
    13. Dim g As Graphics = Graphics.FromImage(bmp)
    14. Dim dx As Integer = (Me.Width - Me.ClientRectangle.Width) \ 2
    15. Dim dy As Integer = Me.Height - Me.ClientRectangle.Height - dx
    16. Dim pt As POINTAPI
    17. pt.x -= dx ' -Rand-Breite
    18. pt.y -= dy ' -Titelzeilen-Höhe
    19. ClientToScreen(Me.Handle, pt)
    20. g.CopyFromScreen(pt.X, pt.Y, 0, 0, Me.Size)
    21. g.Dispose()
    22. bmp.Save("c:\Temp\Shot.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
    23. End Sub
    24. 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!
    Mit Speicherfunktion...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Dim savefiledialog1 As New SaveFileDialog
    3. Try
    4. savefiledialog1.Title = "Save Captured Image"
    5. savefiledialog1.FileName = "Screenshot Image 1"
    6. savefiledialog1.Filter = "All Type Of Image Files|*.*|Joint Photographic Experts Group [JPEG]|*.jpg|Bitmap [BMP|*.bmp|Tagged Image File Format [TIFF]|*.tiff|Portable Network Graphics [PNG]|*.png"
    7. If savefiledialog1.ShowDialog() = DialogResult.OK Then
    8. PictureBox1.Image.Save(savefiledialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
    9. End If
    10. Catch ex As Exception
    11. End Try
    12. End Sub
    13. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    14. Dim bounds As Rectangle
    15. Dim screenshot As System.Drawing.Bitmap
    16. Dim graph As Graphics
    17. bounds = Screen.PrimaryScreen.Bounds
    18. screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    19. graph = Graphics.FromImage(screenshot)
    20. graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
    21. PictureBox1.Image = screenshot
    22. End Sub


    Mfg.eniking1998
    Das hätte einen Nachteil, wenn beim speichern eine Form über seiner ist, dann ist der Screenshot unnütz. Was ist denn an meinem Beispiel auszusetzen ?

    VB.NET-Quellcode

    1. PictureBox100.Image = GetImageFromControl(Panel1)


    Ganz simpel ^^
    Ich hab kein FaceBook : O...

    ^^+...

    Naja 77 PictureBoxen sind so gar nicht OOP..

    EDIT:

    VB.NET-Quellcode

    1. Dim x As Bitmap
    2. x = Panel1.BackgroundImage
    3. Dim savefiledialog1 As New SaveFileDialog
    4. Try
    5. savefiledialog1.Title = "Save Captured Image"
    6. savefiledialog1.FileName = "Screenshot Image 1"
    7. savefiledialog1.Filter = "All Type Of Image Files|*.*|Joint Photographic Experts Group [JPEG]|*.jpg|Bitmap [BMP|*.bmp|Tagged Image File Format [TIFF]|*.tiff|Portable Network Graphics [PNG]|*.png"
    8. If savefiledialog1.ShowDialog() = DialogResult.OK Then
    9. x.Save(savefiledialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp)
    10. End If
    11. Catch ex As Exception
    12. End Try


    Meinst Du das?

    !!!

    Mfg.eniking1998

    Gonger96 schrieb:

    Das hätte einen Nachteil, wenn beim speichern eine Form über seiner ist, dann ist der Screenshot unnütz. Was ist denn an meinem Beispiel auszusetzen ?

    VB.NET-Quellcode

    1. PictureBox100.Image = GetImageFromControl(Panel1)


    Ganz simpel ^^


    Musst doch nur abändern

    VB.NET-Quellcode

    1. GetImageFromControl(Panel1).Save("Pfad")
    Spoiler anzeigen

    "Gonger96" schrieb:

    VB.NET-Quellcode

    1. <DllImport("gdi32.dll")> _
    2. Private Shared Function BitBlt(ByVal hdc 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 Integer) As Boolean
    3. End Function
    4. Function GetImageFromControl(ByVal ctr As Control) As Image
    5. Dim rect As Rectangle = ctr.ClientRectangle
    6. Dim bmp As New Bitmap(rect.Width, rect.Height)
    7. Dim gbmp As Graphics = Graphics.FromImage(bmp)
    8. Dim hdcBmp As IntPtr = gbmp.GetHdc
    9. Dim gMe As Graphics = ctr.CreateGraphics
    10. Dim hdcMe As IntPtr = gMe.GetHdc
    11. BitBlt(hdcBmp, 0, 0, rect.Width, rect.Height, hdcMe, 0, 0, &Hcc0020)
    12. gbmp.ReleaseHdc(hdcBmp)
    13. gMe.ReleaseHdc(hdcMe)
    14. Return bmp
    15. End Function

    Ich habs doch grad gepostet ;(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()

    Du musst die Funktion kopieren und dann in deine Klasse einfügen

    So hier ein Beispielprojekt, wenn dus dann nicht schaffst eine Funktion zu kopieren, kann ich nicht mehr helfen
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()