Control, Picture, Bilder drehen und abspeichern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Control, Picture, Bilder drehen und abspeichern

    Hallo zusammen,

    wollte mir mal schnell ein Steuerelement (Projektvorlage: Windows-Forms-Steuerelementbibliothek(.Net Framework), Framework 4.8) basteln, welches eine verbesserte Picturebox darstellt. (Aber hier sind in diesem Satz ja schon diverse Fehler drin).

    Habe es auch soweit hinbekommen, dass ich das Bild um 90, 180, 270 Grad drehen und auch horizontal und vertikal spiegeln kann. Sie weit so gut.

    Bei jeder Veränderung speichere ich mir den aktuellen sichtbaren Zustand auch in dem Ursprungsdateinamen ab. (Ich möchte ja nicht x Varianten an Dateien von diesem Bild haben)

    Wenn ich das neue Steuerelement nun in einem Testprojekt einfüge, dann bekomme ich die Fehlermeldung "System.Runtime.InteropServices.ExternalException: "Allgemeiner Fehler in GDI+."".

    Mein Control lädt ganz am Anfang eine Grafik und zeigt diese natürlich auch an.

    Was ich jetzt nicht so ganz verstehe ist folgendes: Wenn ich mein Controll, als Admin natürlich, starte, funktioniert in der Vorschau das Drehen und abspeichern in allen Richtungen einwandfrei. Auch die Datei selbst ist im Explorer dann richtig in der Vorschau zu sehen.

    Hier einmal der Code

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Public Class UserControl1
    3. Public bmp As Bitmap
    4. Public Aktuelles_Bild As String
    5. Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. ' WEBP Konvertierung auch auf PNG möglich. Daher über die Eigenschaften die Wahl einstellen, was gewünscht ist (JPG, PNG oder Abfrage nach diesen beiden Typen)
    7. Aktuelles_Bild = "C:\Users\volke\source\repos\Test\BildzumTesten.jpg"
    8. ' aktuelles Bild in einer Variable spreichern
    9. bmp = New Bitmap(Aktuelles_Bild)
    10. PictureBox1.Image = bmp
    11. End Sub
    12. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    13. ' Das Bild drehen
    14. bmp.RotateFlip(RotateFlipType.Rotate90FlipNone) ' hier das richtige raussuchen
    15. ' und so gedreht abspeichern
    16. '''''''''''''''''''''''''''''''''''''''''''''
    17. ' Hier tritt der Fehler auf
    18. '''''''''''''''''''''''''''''''''''''''''''''
    19. bmp.Save(Aktuelles_Bild, ImageFormat.Jpeg)
    20. ' Das gedrehte Bild nun anzeigen
    21. Me.PictureBox1.Image = bmp
    22. End Sub
    23. End Class


    Jetzt zu meinen Fragen:

    1. Wo liegt der Fehler?
    2. Wie kann ich ein Bild so laden, drehen und wieder abspeichern, dass dieser Fehler nicht mehr auftritt.

    Was mir natürlich schon klar ist, dass wenn ich später einmal ein und das gleiche Steuerelement in zwei oder mehreren dieser neuen Steuerelemente geladen habe, dass ich hiermit mir natürlich immer mit einer Aktion in der einen Box die anderen Inhalte nicht verändere bzw. wenn ich in einer der anderen Boxen eine Veränderung durchführe, dies auch Auswirkungen auf die gespeicherte Datei hat. Diese doppelte Benutzung einer gleichen Datei muss aber die Anwendung selbst übernehmen und kann nicht Aufgabe des Steuerelementes sein (oder geht dies auch?).

    Da ich mal das Testprojekt und ein Anzeigeprojekt angefügt habe, hoffe ich mal, dass Ihr mein Problem hiermit schnell nachvollziehen könnt.

    Natürlich habe ich auch die beiden Häkchen gesetzt, die für ein Steuerelement erforderlich sind.

    Vielen Dank erst einmal.

    Volker

    *EXE-Anhang entfernt, Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Volker Bunge Warum erstellst Du nicht eine Projektmappe mit 2 (zwei) Projekten drin und weist der GUI das DLL-Projekt, nicht aber die DLL-Datei, als Verweis zu?
    Ich habe einen temporären Pfad verwendet und der Code läuft einwandfrei.
    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 kann die Fehlerreproduktion auf diese Codezeilen reduzieren:

    VB.NET-Quellcode

    1. Dim Aktuelles_Bild = Dateipfad
    2. Dim bmp = New Bitmap(Aktuelles_Bild)
    3. bmp.Save(Dateipfad, ImageFormat.jpeg)
    Dabei ist es unerheblich, ob derselbe Dateipfad zum Speichern verwendet wird oder ein anderer.
    Verwendet man einen anderen Ziel-Dateipfad (z.B. anderen Dateinamen), klappt es doch. Daher z.B.:

    VB.NET-Quellcode

    1. Dim TemporaererPfad = IO.Path.Combine(Application.StartupPath, "TempImage.jpeg")
    2. Dim bmp As New Bitmap(Aktuelles_Bild)
    3. Using Clone = DirectCast(bmp.Clone, Image)
    4. Clone.Save(TemporaererPfad, ImageFormat.Jpeg)
    5. End Using
    6. bmp.Dispose()
    7. IO.File.Delete(Aktuelles_Bild)
    8. IO.File.Move(TemporaererPfad, Aktuelles_Bild)


    btw: Wusste bis eben gar nicht, dass man in Visual Studio auf nen String mit der Maus hovern kann und wenn der String einen Bilddateipfad beschreibt, dass dann das Bild angezeigt wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo zusammen,

    vielen Dank erst einmal für die Rückmeldung.

    Leider klappt das noch nicht so, wie gewünscht.

    Was habe ich jetzt gemacht?

    Ich habe zuerst einmal den Vorschlag von VaporiZed in eine Sub gepackt und alle Drehmöglichkeiten gekürzt. Sieht jetzt so aus (Natürlich gestartet als Admin)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub Drehen
    2. ....
    3. ' Das Bild drehen
    4. bmp.RotateFlip(RotateFlipType.Rotate90FlipNone)
    5. Call Bild_abspeichern()
    6. ...
    7. End Sub
    8. Sub Bild_abspeichern()
    9. Dim TemporaererPfad = IO.Path.Combine(Application.StartupPath, "TempImage.jpeg")
    10. Dim bmp As New Bitmap(Aktuelles_Bild)
    11. Using Clone = DirectCast(bmp.Clone, Image)
    12. Clone.Save(TemporaererPfad, ImageFormat.Jpeg)
    13. End Using
    14. bmp.Dispose()
    15. IO.File.Delete(Aktuelles_Bild)
    16. IO.File.Move(TemporaererPfad, Aktuelles_Bild)
    17. End Sub


    Die Sub Drehen ist hier jetzt nur als Beispiel zusehen.

    Danach habe ich die Dateien alle noch einmal über den Menüpunkt "Erstellen, neu erstellen" und STRG+B durchlaufen lassen, Selbst den Start per F5 habe ich durchführen lassen. Keine Fehler. Alle 5 Drehrichtungen lassen sich in der Vorschau ohne Probleme durchführen.

    Danach habe ich VB.Net beendet.

    Jetzt habe ich den Ratschlag von RodFromGermany noch einmal durchgeführt (hoffe ich zumindestens)
    1. VB.Net als Admin geöffnet
    2. Neues Projekt angelegt
    3. Windows-Forms-App (.NET Framework) als Vorlage genommen
    4. Projektname "Test" vergeben (Speicherort: C:\Users\volke\source\repos)
    5. Im Projektmappenexplorer Rechtsklick auf "Projektmappe 'Test' (1 von 1 Projekt)" geklickt
    6. "Hinzufügen, vorhandenes Projekt" ausgewählt
    7. Dann die vbproj-Datei meines neuen Steuerelementes ausgewählt und geöffnet
    8. Die Toolbox geöffnet und ganz oben das neue Steuerelement per Doppelklick in die leere Form eingefügt (einmal)
    9. Steuerelement wird auch erst einmal richtig angezeigt (Mein Testbild ist zu sehen)
    10. Programm über "Starten" gestartet
    11. Wenn ich jetzt eine Drehung ausführe, dann bekomme ich diese Fehlermeldung System.IO.IOException: "Der Prozess kann nicht auf die Datei "C:\Users\volke\source\repos\Neue_Picturebox\Bilder\Frontcover.jpg" zugreifen, da sie von einem anderen Prozess verwendet wird."

    Habe dann mal meine alte Variante

    VB.NET-Quellcode

    1. bmp.RotateFlip(RotateFlipType.Rotate90FlipNone)
    2. bmp.Save(Aktuelles_Bild, ImageFormat.Jpeg)
    3. Me.PictureBox1.Image = bmp

    wieder aktiviert (immer noch in meinem Testprogramm) und wie oben schon beschrieben 2 x Erstellen aufgerufen und das Testprogramm über "Starten" gestartet. Ich bekomme bei bmp.save folgende Fehlermeldung: System.Runtime.InteropServices.ExternalException: "Allgemeiner Fehler in GDI+."

    Sofern ich jetzt alle anderen Schritte richtig gemacht habe, funktionieren beide Speichermöglichkeiten nicht. Es ändert sich nur die Fehlermeldung.
    In der Vorschau funktionieren beide Möglichkeiten.

    Ist schon alles etwas komisch.

    Gibt es noch Stellen, die ich ändern bzw. überprüfen muss / sollte?

    Generell mal eine Frage: Wenn ich ein Bild / Datei über einen Stream in eine Variable packe, dann ist doch dieses Bild/Datei in meinem Arbeitsspeicher als "Kopie" einer Variablen abgelegt und mit der kann ich dann doch alles machen, was ich möchte. Die Originaldatei wird doch ab hierhin gar nicht mehr benötigt (sofern natürlich das Einlesen in die Variable abgeschlossen ist). Rein technisch könnte ich doch die Originaldatei löschen und müsste dann nur sicher stellen, dass diese beim Schließen der Picturebox wieder abgespeichert wird. Das diese Vorgehensweise natürlich nicht praktisch ist, ist klar. Aber rein von der Logik bzw. Möglichkeit verstehe ich das doch richtig?

    Aufgrund meiner gerade dargelegten Frage habe ich einfach mal IO.File.Delete(Aktuelles_Bild) vor den Save-Befehlt gelegt, aber leider bekomme ich auch hier die Fehlermeldung "Datei wird gerade benutzt".

    Alles ein wenig komisch bzw. mir noch nicht ganz logisch, wo bei mir der Fehler liegt.

    Wäre schön, wenn Ihr mir noch ein paar Lösungsansätze geben könntet.

    Vielen Dank

    Volker

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Volker Bunge“ ()

    Welcher Fehler taucht denn bei meinem Vorschlag auf? Hab ich da was bei Deinem Post diesbezüglich überlesen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Volker Bunge

    Hast du mal versucht, ob das genauso mit dem Fehler ist, wenn du die "richtige exe-Datei" startest und nicht aus dem Studio das Prog startets.

    Ich hatte das nämlich mal, bei einem meiner Projekte, das ich einen ähnlichen Fehler bekam, wenn ich aus dem Studio das Prog startete.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Schreibrechte in diesem Ordner?
    Verschiebe mal alles in einen anderen Ordner (z.B. C:/Testordner) und versuche es damit.

    Und man muss aufpassen. Wenn eine Picturebox direkt mit einer Datei gefüttert wird, dann hat die Picturebox ein Schreiblock auf der Datei. Diese kann also nicht direkt geschrieben werden, solange diese mit der Picturebox verbunden ist.
    Am Besten den Inhalt der Picturebox in eine BMP kopieren, die Picturebox entladen und dann neu aus der Variable befüllen. Dann ist der Schreiblock auf das Bild weg und Du kannst es überschreiben.

    Oder gleich das Bild NICHT in die Picturebox laden, sondern in eine Variable und dann nur die Variable der Picturebox zuweisen.

    Hier ein Beispiel:

    VB.NET-Quellcode

    1. If File.Exists("c:\test\test.png") Then
    2. Dim xx As Image
    3. Using str As Stream = File.OpenRead("c:\test\test.png")
    4. xx = Image.FromStream(str)
    5. End Using
    6. PictureBox1.Image = xx
    7. Else
    8. PictureBox1.Image = My.Resources.DragHere
    9. End If
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    @Volker Bunge Ich habe mir jetzt nicht jeden einzelnen Post angeschaut. Die Fehlermeldung System.IO.IOException kann evtl. durch die Preview im Explorer entstehen solange das Bild in der Preview noch angezeigt wird. Ich kenne nun Deinen PreviewHandler nicht (eventuell durch ein anderes Programm verstellt) der da das Bild im Explorer für die Preview lädt. Wenn dieser das Bild offen hält, kannst Du natürlich nicht speichern. Probehalber mal auf eine andere Datei im Explorer klicken, dann wird auch der Zugriff durch den PreviewHandler auf das Bild beendet (sollte zumindest so sein). System.Runtime.InteropServices.ExternalException: "Allgemeiner Fehler in GDI+." kann leider alles mögliche sein. Ansonsten kannst Du mal dieses Probieren:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.ComponentModel
    3. Public Class Form1
    4. Private TempBmp As Bitmap
    5. Private OrgImageFormat As Imaging.ImageFormat
    6. Private FileName As String = "D:\Bild.jpg"
    7. Private Sub LoadImage_Click(sender As Object, e As EventArgs) Handles LoadImage.Click
    8. If File.Exists(FileName) Then
    9. Using OrgBmp As New Bitmap(FileName)
    10. OrgImageFormat = OrgBmp.RawFormat
    11. DisposeImage()
    12. TempBmp = New Bitmap(OrgBmp)
    13. End Using
    14. PictureBox1.Image = TempBmp
    15. End If
    16. End Sub
    17. ' Optional, wird ja schon nach der Drehung gespeichert
    18. Private Sub SaveImage_Click(sender As Object, e As EventArgs) Handles SaveImage.Click
    19. TempBmp?.Save(FileName, OrgImageFormat)
    20. End Sub
    21. Private Sub RotateImage_Click(sender As Object, e As EventArgs) Handles RotateImage.Click
    22. If TempBmp IsNot Nothing Then
    23. TempBmp.RotateFlip(RotateFlipType.Rotate180FlipX)
    24. TempBmp.Save(FileName, OrgImageFormat)
    25. PictureBox1.Invalidate()
    26. End If
    27. End Sub
    28. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    29. DisposeImage()
    30. End Sub
    31. Private Sub DisposeImage()
    32. If PictureBox1.Image IsNot Nothing Then
    33. PictureBox1.Image.Dispose()
    34. TempBmp.Dispose()
    35. End If
    36. End Sub
    37. End Class


    Das funktioniert bei mir, unter Win10, sogar wenn der Standard-PreviewHandler von Windows das Bild im Explorer anzeigt problemlos.
    Mfg -Franky-
    Hallo zusammen,

    vielen Dank erst einmal für die vielen Rückmeldungen.

    Mein Problem scheint also doch nicht so einfach zu sein.

    So, was habe ich nun als Erstes getan?

    Ich habe die
    bmp.Save(Aktuelles_Bild, ImageFormat.Jpeg)
    Me.PictureBox1.Image = bmp

    Zeilen erst einmal in eine separate Sub gepackt. Dadurch kann ich nun die verschiedenen Möglichkeiten von Euch besser und einfacher austauschen und testen. Grundsätzlich sollte man ja auch immer gleiche Abläufe separat halten.

    Bevor es weiter geht noch eine kleine Erklärung bzw. Ergänzung: Ich arbeite mit PictureBox1_MouseHover und PictureBox1_MouseLeave und tausche dort das Bild zwischen Backgroundimage und Image hin und her. Sobald sich die Maus auf der Picturebox befindet, wird eine feste Menügrafik in das Image geladen und liegt somit über der Grafik. Dann werte ich noch mein Klicken die Koordinaten aus kann somit die Möglichkeiten die ich haben möchte auswerten. Klappt soweit perfekt. Aufgrund dieser Tatsache viel mir gestern ein, dass er doch völlig reicht, wenn die Grafik dann gespeichert wird, wenn der Mauszeiger nicht mehr auf der Picturebox ist. Also habe ich den Speicheraufruf hier in die Sub PictureBox1_MouseLeave ans Ende gepackt.

    @VaporiZed: Mit Deinem Code bekomme ich die Meldung: Datei wird schon benutzt und er steigt in der Delete-Zeile aus. Ausprobiert im Testfenster. Explorer oder ähnliche Programme sind nicht offen.

    @Amelie: Vielen Dank für den Hinweis. Also mit dem Code von VaporiZed kommt der gleiche Fehler in der EXE-Datei

    @Dive26: Wie ja auch schon VaporiZed im Post 3 auf den Dreizeiler gebracht hat, lade ich schon das Bild in eine Variable und weise auch der Box nur diese globale Variable zu. Somit existiert doch die benutzte Grafik nur in meinem Arbeitsspeicher.

    Aber ich habe trotzdem Deinen Code mal ausprobiert. Dabei habe ich meine alte Speichermethode verwendet und auch noch den Explorer geöffnet, um zu sehen, wie die Grafik in der Vorschau aussieht. In der Testvorschau hat es perfekt geklappt. Das Abspeichern und auch das aktualisieren im Explorer hat einwandfrei funktioniert.Also habe ich dann mal Control neu erstellt und dann das Testprojekt auch neu erstellt und es dann über die EXE-Datei getestet. Auch hier klappt es wie es soll. Mein Testprojekt besteht aus zwei neuen Pictureboxen und die zeigen am Anfang den Letzten gespeicherten Stand an. Wenn ich jetzt eine ändere und die Maus verlässt die Picturebox, dann wird mir auch im Explorer die richtige Anzeige angezeigt. Im Explorer stehe ich sogar auf der Datei und sehe die Vorschau einmal klein und rechts groß. Es läuft bis jetzt.

    Dann habe ich aber doch noch einen Fehler entdeckt. Als ich die EXE gestartet habe und nur mit der Maus über die Box gefahren bin und diese dann wieder verließ, kam der GDI+ Fehler.

    Dabei habe ich festgestellt, dass es zwar die Bilddatei gibt, aber mit 0 KByte. Also wollte ich mal feststellen, ob in meiner BMP-Variable überhaupt noch ein Bild drin steht und habe mir per MSGBox die BMP.Width mal anzeigen lassen. Es kam ein Wert von über 1000 heraus. Aufgrund dieser Tatsache, habe ich mir eine globale Variable „Bild_gedreht“ angelegt, die ich nach jeder Bearbeitung auf True setze. Vor dem Speichern prüfe ich diese nun auf True und setzte sie nach dem Speichern zurück auf False.

    Das hat zwar den Nachteil, dass wenn ich jetzt eines der gleichen Bilder ändere, wird mir das zweite nicht mehr in dessen Anzeige abgespeichert wenn ich nur über dieses mit der Maus fahre. Da ich aber hier eh einen logischen Fehler gemacht habe, in dem ich in zwei Boxen ein und dasselbe Bild gepackt habe, ist es hier nur logisch, dass sich das Programm so verhält, wie es das gerade tut. Somit alles Gut.

    @Franky: Auch Deinen Code habe ich mal getestet, bzw. testen wollen. Aber ich bekomme die Zeile 14 nicht richtig aktiviert. OrgBmp.RawFormat wird bei mir rot unterstrichen. Fehlercode BC30311: Der Wer vom Typ „ImageFormat“ kann nicht in „Bitmap“ konvertiert werden.
    Daher hier die Frage: Wo liegt der Fehler?
    Aber ist Deine Lösung nicht fast das gleiche wie von Dive26?

    So, werde jetzt erst einmal die Lösung von Dive26 ausgiebig testen und dann noch ein wenig weiter mein Neues Control ausbauen.

    Ich wünsche Euch noch allen einen schönen Sonntag.

    Volker

    Volker Bunge schrieb:

    Ich arbeite mit PictureBox1_MouseHover und PictureBox1_MouseLeave und tausche dort das Bild zwischen Backgroundimage und Image hin und her.
    Und damit wird die Bitmap an anderer Stelle nochmal verwendet und somit blockiert. Du musst vor dem Dateilöschen schon alle betroffenen Bitmaps freigeben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Volker Bunge schrieb:

    OrgBmp.RawFormat wird bei mir rot unterstrichen. Fehlercode BC30311: Der Wer vom Typ „ImageFormat“ kann nicht in „Bitmap“ konvertiert werden.
    Daher hier die Frage: Wo liegt der Fehler?
    Aber ist Deine Lösung nicht fast das gleiche wie von Dive26?

    Keine Ahnung warum bei Dir ein Fehler angezeigt wird. OrgImageFormat ist vom Typ Imaging.ImageFormat und nicht Bitmap. @dive26 geht den Weg über ein Stream. Mein Bsp. nicht. Spielt aber keine Rolle. Es geht ja nur darum den Zugriff auf das Bild nach dem Laden gleich wieder freizugeben.
    Mfg -Franky-
    Hallo zusammen,

    @'VaporiZed:
    ​Und damit wird die Bitmap an anderer Stelle nochmal verwendet und somit blockiert. Du musst vor dem Dateilöschen schon alle betroffenen Bitmaps freigeben.


    Da ich schon von Anfang an das Bild in eine Variable speichere (habe ich so zu mindestens gedacht), sollte doch die Grafik nur im Arbeitsspeicher liegen. Alle Zuordnungen laufen dann über ...Image = BMP (meine Variable). Selbst wenn ich das Bild drehe, drehe ich doch das Bild im Arbeitsspeicher und zeige dies dann wieder mit ...Image = BMP an. Oder habe ich hier generell noch ein Gedankenfehler.

    Da jetzt Dive26 seine Lösung erst einmal läuft, werde ich hier erst einmal weiter arbeiten.

    @Franky: Vielen Dank für den Hinweis. Sollte es doch widererwartend Schwierigkeiten mit Dive26 seine Lösung geben, dann werde ich noch einmal Deine Lösung testen.

    Gruß

    Volker

    Volker Bunge schrieb:

    sollte doch die Grafik nur im Arbeitsspeicher liegen.
    Bild-Dateien und Bitmap-Instanzen sind da so ein eigen Ding.
    Du musst beide sorgfältig voneinander entkoppeln, ich mache das ebenfalls über einen Stream.
    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!

    Volker Bunge schrieb:

    @Franky: Vielen Dank für den Hinweis. Sollte es doch widererwartend Schwierigkeiten mit Dive26 seine Lösung geben, dann werde ich noch einmal Deine Lösung testen.

    Wie geschrieben. Es spielt keine Rolle wie Du den dauerhaften Dateizugriff, beim Laden einer Bilddatei, unterbindest. Entweder so, wie dive26 das über einen Stream macht oder so wie ich das mache. Das Ergebnis ist das gleiche. Viele Wege führen zum Ziel. ;)
    Mfg -Franky-