Bild mit neuer Größe speichern

  • VB.NET

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

    Bild mit neuer Größe speichern

    Hallo!

    Ich mit

    VB.NET-Quellcode

    1. ListBox1.Items.AddRange(IO.Directory.GetFiles(My.Application.Info.DirectoryPath & "\bilder"))

    Dateinamen aus einem Verzeichnis in eine Listbox geladen. (Dieses Verzeichnis enthält nur Bilder)

    Nun sollen die Bilder nacheinander in eine Picturebox geladen werden. Die Picturebox hat die Größe von 100x100 Pixel und ist auf StrechImage gesetzt. Dann sollen die Bilder mit der neuen Größe gespeichert werden. Jedoch wird das Bild mit der bisherigen Größe gespeichert. Damit die bisherigen Bilder nicht überschrieben werden, werden die neuen Bilder im Unterverzeichnis "Klein" abgelegt.

    Das ganze läuft in einem Timer wie folgt ab:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. Dim p As Integer
    3. Dim Kette As String
    4. PictureBox1.Image = Image.FromFile(ListBox1.Items(Index))
    5. p = InStr(ListBox1.Items(Index), "\bilder")
    6. Kette = ListBox1.Items(Index)
    7. Kette = Mid(Kette, 1, p - 1) & "\klein" & "\" & Mid(Kette, p + 7, Len(Kette))
    8. PictureBox1.Image.Save(Kette, Imaging.ImageFormat.Jpeg)
    9. Index = Index + 1
    10. If Index = ListBox1.Items.Count Then Timer1.Enabled = False
    11. End Sub


    Index wird beim Laden der Form auf 0 gesetzt.

    Was fehlt, damit die Bilder mit der neuen Größe gespeichert werden?

    *Topic verschoben*

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

    @Selter98 So was:

    VB.NET-Quellcode

    1. Dim fis() = New IO.DirectoryInfo("c:\temp\Images\").GetFiles("*.png", SearchOption.TopDirectoryOnly)
    2. For Each fi In fis
    3. Dim path = fi.FullName
    4. Using imgSource As New Bitmap(path)
    5. ' neue Bröße
    6. Dim imgWidth = 1278
    7. Dim imgHeight = 958
    8. ' Bitmap-Objekt in der neuen Größe erstellen
    9. Dim imgDest As New Bitmap(imgWidth, imgHeight)
    10. ' Bild interpolieren, damit die Qualität erhalten bleibt
    11. Using g As Graphics = Graphics.FromImage(imgDest)
    12. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    13. g.DrawImage(imgSource, New Rectangle(0, 0, imgWidth, imgHeight))
    14. End Using
    15. imgDest.Save(path + ".png")
    16. End Using
    17. Next
    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!
    Die Zeile

    VB.NET-Quellcode

    1. ​Using imgSource As New Bitmap(path)


    meldet:

    Ein Ausnahmefehler des Typs "System.ArgumentException" ist in System.Drawing.dll aufgetreten.
    Zusätzliche Informationen: Ungültiger Parameter.

    path hat den Wert: "g:\Eigene Dateien\Dokumente\Visual Studio 2015\Projects\Speiseplaner\Speiseplaner\bin\Debug\klein\Ananas.jpg"
    Und? Ist der Pfad korrekt? Gibt es die Datei? Das G am Anfang kommt mir suspekt vor. Wenn der Pfad nicht stimmt, musst Du wohl daran was im Voraus ändern bzw. path mit nem korrekten Text befüllen.
    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.
    Die Datei gibt es noch nicht. Diese soll ja durch das "kleiner machen" in dem angegebenen Verzeichnis neu erstellt werden.

    Nun habe ich im angegebenem Verzeichnis ein leeres Bild zum Testen angelegt. Dann hat es geklappt. Allerdings finde ich es mühsam jedes einzelne Bild erst leer per Hand neu zu erstellen, damit das Programm mir eine kleinere Kopie davon ablegt. Daher habe ich nun alle Bilder in ein Verzeichnis Namens "Groß" als Sicherungskopie kopiert und die Bilder im ursprünglichen Verzeichnis sollten nun verkleinert werden.

    Allerdings mosert das Programm nun an folgender Stelle:

    VB.NET-Quellcode

    1. ​imgDest.Save(path, Imaging.ImageFormat.Jpeg)


    Ein Ausnahmefehler des Typs "System.Runtime.InteropServices.ExternalException" ist in System.Drawing.dll aufgetreten.
    Zusätzliche Informationen: Allgemeiner Fehler in GDI+.

    path hat nun folgendes Wert: "g:\Eigene Dateien\Dokumente\Visual Studio 2015\Projects\Speiseplaner\Speiseplaner\bin\Debug\bilder\Ananas.jpg"
    Gibt es diese Datei dann schon? Vorher ggf. prüfen – per Code, nicht per Hand. Allgemeiner GDI+-Fehler ist ziemlich nervtötend, kann alles mögliche sein, aber in so nem Zusammenhang meist ein Dateizugriffsproblem
    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.
    Vor dem Speichern-Befehl habe ich nun folgendes eingefügt:

    VB.NET-Quellcode

    1. ​ Datei = path
    2. Do
    3. p = InStr(Datei, "\")
    4. If p <> 0 Then
    5. Datei = ZeichenLöschen(Datei, 1, p)
    6. End If
    7. Loop Until p = 0
    8. path = My.Application.Info.DirectoryPath & "\klein\" & Datei


    und schon klappt es. Scheinbar kann die Original-Datei während der Prozedur nicht überschrieben werden. Dein Tipp mit der Dateizugriffsverletzung hat mir da weitergeholfen.
    Zum erzeugen von Pfaden, nutze IO.Path.Combine() und meide (wenn es .Net Alternativen gibt) den My Namespace.

    VB.NET-Quellcode

    1. IO.Path.Combine(Application.StartupPath, "klein", Datei)

    @Selter98 Der Pfad enthält Leerzeichen.
    Ggf. musst Du den Pfad in Apostrophen einschließen:

    VB.NET-Quellcode

    1. Dim path = String.Format("""{0}""", "g:\Eigene Dateien\Dokumente\Visual Studio 2015\Projects\Speiseplaner\Speiseplaner\bin\Debug\klein\Ananas.jpg")
    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!