Image.save ungültiger Parameter

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von GreenBear.

    Image.save ungültiger Parameter

    Hallo ;)
    Ich möchte eine Seite eines Bildes drehen und speichern. Das hat super mit wenig Code funktioniert. Aber jetzt bekomme ich immer die Fehlermeldung "ungültiger Parameter" beim Speichern obwohl der Pfad vom Treeview kommt.

    VB.NET-Quellcode

    1. pb.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
    2. pb.Image.Dispose()
    3. pb.Image.Save(tvArchivierungEingang.SelectedNode.FullPath)
    4. pb.Image = New Bitmap(tvArchivierungEingang.SelectedNode.FullPath)



    Ich war selten so verzweifelt. Ich freue mich auf eure Antworten.
    We are all suckerz for something ...
    Hallo und Willkommen

    Wenn du das Image Disposed kannst es danach nicht speichern.
    Umgekehrt schon.

    Gruße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Ich habe es gerade so probiert und es klappt alles.
    Stimmen die Pfade?

    VB.NET-Quellcode

    1. Me.PictureBox1.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
    2. Me.PictureBox1.Image.Save("D:\Test.png")
    3. Me.PictureBox1.Image.Dispose()
    4. Me.PictureBox1.Image = New Bitmap("D:\Test.png")


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m die Pfade werden ja vom Treeview übergeben. Kann es sein, dass es ein Fehler von Visual Studio 2017 ist, dass ich letztens installiert habe? In der 2013-Version habe ich auch kein Problem damit...
    We are all suckerz for something ...
    Und du hast die Pfade trotzdem kontrolliert?
    Zeig mal ne Debug ausgabe!

    Hast es mit Hardcoded Pfaden probiert?

    Edit: Ich kann mir nicht vorstellen das obige Code funktioniert hat.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    @Nofear23m

    Ich habe einen Screenshot vom Absturz und dem Debug-Fenster angehängt.
    Außerdem habe ich raus gefunden, dass das Programm nur abzustürzen zu scheint wenn ich Dateipfade benutze, die es schon gibt.

    Wenn ich einen neuen Dateiname vergebe speichert er allerdings nur eine Seite des Dokuments..
    Bilder
    • Unbenannt.jpg

      151,9 kB, 1.264×478, 126 mal angesehen
    We are all suckerz for something ...
    Hallo

    Siehst du , das sind Infos mit welchen man etwas anfangen kann.
    1.) Versuche mal die Datei zu löschen vor dem speichern. IO.File.Delete(filename)
    2.) Evtl hast du ja die existierende Datei schon innerhalb der Applikation erstellt und nicht wieder freigegeben. Weis ich nicht. Siehst du aber wenn io.Delete nicht funzt.

    ​Edit: Was meinst du mit "eine Seite des Dokuments". Wir reden schon von Bildern, auch wenn es *.tif sind.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Edit: Was meinst du mit "eine Seite des Dokuments". Wir reden schon von Bildern, auch wenn es *.tif sind.

    Tiff kann mehrere Seiten beinhalten. Stichwort: multipage-tiff

    @GreenBear
    Multipage-Tiff kannsu nicht über Methode Save schreiben, sondern beispielsweise wie in diesem Link

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

    @xtts02

    Danke. weis ich. Sagte er nur nie. Es wurde immer von Bilder, nicht von Dokumenten gesprochen.

    ​Deshalb würde ich mit der Info mit einer anderen Überladung arbeiten oder gar einen Encoder hernehmen.
    ​Me.PictureBox1.Image.Save(filename, Imaging.ImageFormat.Tiff)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Also die Datei vorher zu löschen funktioniert nicht. Ich bekomme eine Fehlermeldung, die auf deinen 2. Punkt hinweist (Der Prozess kann nicht auf die Datei "C:\ArchivierungEingang\NEU3.tif" zugreifen, da sie von einem anderen Prozess verwendet wird.").
    Wenn ich die Stelle gefunden habe wie gebe ich die Applikation dann frei?

    Es geht hauptsächlich um eingescannte Dokumente oder Mail-anhänge (Rechnungen, Gutschriften ...). Dazu gehören auch multipage-tiff.
    We are all suckerz for something ...
    Hallo

    Dachte ich mir fast.
    Wenn ich die Stelle gefunden habe wie gebe ich die Applikation dann frei?


    Du gibst nicht die Applikation frei sondern das Image Objekt. Ich weis nicht WO du es erstellst. Das musst schon DU wissen.
    Es kann auch sein das gar nicht DU der Übeltäter bist. Ich vermute mal grob das die Scansoftware das File nicht freigibt.
    Kann es sein das das Scanprogramm noch offen ist, oder im Taskmanager noch was von dem Scanprogramm vorhanden ist. All das ist möglich.

    Fakt ist das du nicht auf die Datei zugreifen kannst. Also kannst du diese auch nicht überschreiben.

    Warum und weshalb, da können wir dir nur bedingt Helfen. Welche Scansoftware, Was ist im Taskmanger usw.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m danke bis jetzt. Und ist mir schon klar Sascha. Aber wenn ich das Objekt frei gebe wechselt die Anwendung in den Haltemodus und bleibt somit stehen und an der Scan software liegt es nicht, da ich im Moment nur mit Test-dokumenten arbeite, die nicht von mir eingescannt wurden.

    Es liegt wohl wie @xtts02 geschrieben hat an dem Multipage-Tiff und ich muss mich da einlesen mit Encodern und so?
    We are all suckerz for something ...
    Stell doch mal ein Testfile bereit. Vieleicht könnnen wir dir dann helfen.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich hab hier mal ein Test-Projekt erstellt mit allen Funktionalitäten, die benötigt sind. Der Fehler beim Drehen ist genau der Selbe:

    Steuerelemente:
    Treeview (tvArchivierungEingang)
    Picturebox (pb)
    Button (btnVorherigeSeite)
    Button (btnNaechsteSeite)
    Button (btnRotate)
    Label (lblSeiten)


    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. treeviewFuellen(tvArchivierungEingang, "C:\ArchivierungEingang", True)
    5. tvArchivierungEingang.Nodes(0).Toggle()
    6. End Sub
    7. ''' <summary>
    8. ''' Stellt in einem Treeview die Struktur in dem übergebenen Ordner dar
    9. ''' </summary>
    10. ''' <param name="tree">Treeview-Objekt</param>
    11. ''' <param name="sPfad">Pfad des darzustellenden Ordners</param>
    12. ''' <param name="bDateien">Sollen auch Dateien dargestellt werden?</param>
    13. ''' <remarks></remarks>
    14. Public Sub treeviewFuellen(tree As TreeView, sPfad As String, bDateien As Boolean)
    15. Dim nNode As New TreeNode(sPfad)
    16. tree.Nodes.Add(nNode)
    17. nodeFuellen(nNode, bDateien)
    18. End Sub
    19. ''' <summary>
    20. ''' stellt in dem übergebenen Treenode (Knotenpunkt des Treeviews, dass auch weitere Knoten enthalten kann) die Ordnerstruktur dar, die dem Node übergeben wurde.
    21. ''' </summary>
    22. ''' <param name="dNode">TreeNode, dass die Struktur darstellen soll</param>
    23. ''' <param name="bDateien">Sollen auch Dateien dargestellt werden?</param>
    24. ''' <remarks></remarks>
    25. Private Sub nodeFuellen(dNode As TreeNode, bDateien As Boolean)
    26. Dim d As New DirectoryInfo(dNode.FullPath)
    27. For Each di As DirectoryInfo In d.GetDirectories
    28. Dim nNode As New TreeNode(di.Name, 0, 0)
    29. dNode.Nodes.Add(nNode)
    30. 'REKURSION!! Um Ordnerstrukturen in Ordnern darzustellen
    31. nodeFuellen(nNode, bDateien)
    32. Next
    33. If bDateien Then
    34. For Each File As FileInfo In d.GetFiles
    35. Dim sDatei As String = File.Name
    36. Dim sDateiEndung As String = Mid(sDatei, sDatei.Length - 3)
    37. If sDateiEndung = ".tif" Or sDateiEndung = ".pdf" Or sDateiEndung = ".bmp" Or sDateiEndung = ".jpg" Then
    38. Dim nNode As New TreeNode(File.Name, 1, 1)
    39. dNode.Nodes.Add(nNode)
    40. End If
    41. Next
    42. End If
    43. End Sub
    44. Dim iSeitenAnzahl As Integer = 0
    45. Dim iAktuelleSeite As Integer = 0
    46. Dim bersterAufruf As Boolean = True
    47. Private Sub tvArchivierungEingang_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles tvArchivierungEingang.AfterSelect
    48. If bersterAufruf = False Then
    49. vorschau(tvArchivierungEingang.SelectedNode.FullPath, 1)
    50. Else
    51. bersterAufruf = False
    52. End If
    53. End Sub
    54. Public Sub vorschau(sPfad As String, iSeite As Integer)
    55. pb.Image = Image.FromFile(sPfad)
    56. iSeitenAnzahl = pb.Image.GetFrameCount(Imaging.FrameDimension.Page)
    57. iAktuelleSeite = iSeite
    58. pb.Image.SelectActiveFrame(Imaging.FrameDimension.Page, iSeite - 1)
    59. lblSeiten.Text = " Seite " & iAktuelleSeite & " Von " & iSeitenAnzahl
    60. End Sub
    61. Private Sub btnRotate_Click(sender As Object, e As EventArgs) Handles btnRotate.Click
    62. pb.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
    63. 'IO.File.Delete(tvArchivierungEingang.SelectedNode.FullPath)
    64. pb.Image.Save(tvArchivierungEingang.SelectedNode.FullPath)
    65. pb.Image.Dispose()
    66. pb.Image = New Bitmap(tvArchivierungEingang.SelectedNode.FullPath)
    67. End Sub
    68. Private Sub btnVorherigeSeite_Click(sender As Object, e As EventArgs) Handles btnVorherigeSeite.Click
    69. iAktuelleSeite -= 1
    70. If iAktuelleSeite = 0 Then
    71. iAktuelleSeite = iSeitenAnzahl
    72. End If
    73. vorschau(tvArchivierungEingang.SelectedNode.FullPath, iAktuelleSeite)
    74. End Sub
    75. Private Sub btnNaechsteSeite_Click(sender As Object, e As EventArgs) Handles btnNaechsteSeite.Click
    76. iAktuelleSeite += 1
    77. If iAktuelleSeite > iSeitenAnzahl Then
    78. iAktuelleSeite = 1
    79. End If
    80. vorschau(tvArchivierungEingang.SelectedNode.FullPath, iAktuelleSeite)
    81. End Sub
    82. End Class
    We are all suckerz for something ...