Bild mit transparentem Hintergrund von Panel speichern.

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von whatever.

    Bild mit transparentem Hintergrund von Panel speichern.

    Neuer Tag - Neues Problem :D


    Ich habe einen Code der momentan ganz gut klappt und den Inhalt eines Panels als ein Bild (.PNG) abspeichert.
    Mein Problem ist, dass obwohl die BackgroundColor des Panels auf "Transparent" eingestellt ist, die Backgroundcolor der Form als Hintergrund des Bilded gespeichert wird.

    Habt ihr eine Idee wie ich das Panel so abspeichern kann, dass das .PNG Bild einen transparenten Hintergrund hat?

    Vielen vielen Dank

    Code:

    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
    16. Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
    17. GetImageFromControl(Panel1).Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.png"))
    18. End Sub
    ich weiss nur, wie man bei einer Bitmap eine bestimmte Farbe in Color.Transparent umwandeln kann - vlt kannste damit was für dich brauchbares basteln:

    Quellcode

    1. Public Sub MakeTransparent(transparentColor As System.Drawing.Color)
    2. Member of System.Drawing.Bitmap
    3. Summary:
    4. Makes the specified color transparent for this System.Drawing.Bitmap.

    whatever schrieb:

    oder?
    Manchmal genügt das nicht, da kommt der Garbage-Collector nicht nach, dier freigegebenen Ressourcen zu bereinigen, da muss man ihn dazu "zwingen" mit

    VB.NET-Quellcode

    1. GC.Collect()
    (bitte sehr sorgfältig testen).
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    was meinst du mit "Überlaufen"?
    Zeigen sich iwo im System Probleme?

    Weil nach dem was ich so gehört habe, ist ein erzwungenes gc.collect nur optische Makulatur, verbessert nichts, bringt aber den ausgebufften Bereinigungs-Algorithmus durcheinander, und kostet so Performance.

    .Net-Proggis belegen immer viel mehr Speicher als minimal nötig, geben aber wieder frei, wenn das System andernorts welchen anfordert.
    @ErfinderDesRades Im Prinzip ja.
    Wenn Du jedoch permanent 60 Bilder pro Sekunde auswertest, kommt das System nicht unbedingt mit dem Aufräumen hinterher, da hilft dann GC.Collect().
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Nein es kommt einfach eine Exception (Nicht genügend Arbeitsspeicher)
    Mache ich etwas falsch?

    Ab ~ 20 Bildern kommt die Nachricht. Und ja... die Bilder sind sehr groß, daran kann ich aber leider nichts ändern.
    Vielleicht einfach Wartezeiten zwischen dem Erstellen von Bildern einbauen?

    Auch mit GC kommt die OutOfMemoryException...

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „whatever“ ()

    whatever schrieb:

    Auch mit GC kommt die OutOfMemoryException...
    was für meine Ansicht spricht: gc.collect ist Makulatur.

    Und du disposest die new Bitmap (zeile #9) nicht.
    weiters brauchst du auch nicht jedesmal eine neue UrsprungBitmap erstellen - es ist doch immer dieselbe, oder?



    auch würde ich den Trycatch wegmachen - das verhindert, dass dir die genaue Fehlerzeile angezeigt wird.

    Und das: printTEXT.ToString ist mir sehr unangenehm - denk mal nach: welchen Datentyp hat denn printTEXT?

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

    ErfinderDesRades schrieb:

    gc.collect ist Makulatur
    Wir hatten eine professionelle Bildverarbeitung im Einsatz (HALCON), da wurde explizit geraten, mit GC.Colllect() zu arbeiten:
    de.ids-imaging.com/halcon.html
    Klar, es muss im richtigen Kontext aufgerufen werden.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!