Hallo,
der folgende Code scannt über eine Funktion ein Bild und speichert dieses in eine Datei auf die Festplatte. Danach soll dieses Bild in das Programm auf das Arbeitsblatt geöffnet werden. Auf den Ersten Blick sieht das vorherige Speichern unsinnig aus, aber ich habe den Grund, daß die Bilddatei von tesseract 4 auf Text untersucht werden soll. Mein Problem ist nun, daß ich eine Fehlermeldung bekomme, wenn die Datei zum zweitenmal in die gleiche Datei gespeichert werden soll. Ich habe schon viel von "using" oder "stream" gelesen, doch irgendwie will es nicht klappen. Eigenartigerweise funktioniert eine ähnliche Funktion einwandfrei:
Nun die Funktion, die ein Bild mehrmals nacheinander speichern kann, ohne wegen eines angeblichen Zugriffs einer anderen Prozedur abzubrechen:
Wenn Jemand von euch eine Lösung hat, würde ich mich sehr über ein Beispiel freuen.
Vielen Dank schon mal im Voraus
*Code-Tag Formatierung korrigiert* ~NoFear23m
der folgende Code scannt über eine Funktion ein Bild und speichert dieses in eine Datei auf die Festplatte. Danach soll dieses Bild in das Programm auf das Arbeitsblatt geöffnet werden. Auf den Ersten Blick sieht das vorherige Speichern unsinnig aus, aber ich habe den Grund, daß die Bilddatei von tesseract 4 auf Text untersucht werden soll. Mein Problem ist nun, daß ich eine Fehlermeldung bekomme, wenn die Datei zum zweitenmal in die gleiche Datei gespeichert werden soll. Ich habe schon viel von "using" oder "stream" gelesen, doch irgendwie will es nicht klappen. Eigenartigerweise funktioniert eine ähnliche Funktion einwandfrei:
VB.NET-Quellcode
- Private Sub BildScannenMenue_Click(sender As Object, e As EventArgs) Handles BildScannenMenue.Click
- Scannen()
- If Not GescanntesBild Is Nothing Then
- Try
- 'Bei Bedarf wird das gescannte Bild gedreht
- If ScannerAutomatischdrehen = 1 Then
- 'Wenn das Querformat ausgewählt ist, wird das Scannergebnis um
- '90 Grad nach Rechts gedreht.
- If Grafikausrichtung = 1 Then
- GescanntesBild.RotateFlip(RotateFlipType.Rotate90FlipNone)
- End If
- End If
- 'Wenn die Bilddatei bereits existiert, wird sie gelöscht.
- If My.Computer.FileSystem.FileExists(Userverzeichnis & "\Scanner.png") Then
- ' My.Computer.FileSystem.DeleteFile(Userverzeichnis & "\Scanner.png")
- End If
- 'Falls die Seitenränder berücksichtigt werden müssen, werden diese abgeschnitten.
- If SeitenraenderScannen = 1 Then
- X1 = GescanntesBild.Width / Seitenbreite * LinkerRand
- Y1 = GescanntesBild.Height / Seitenhoehe * ObererRand
- Breite = GescanntesBild.Width / Seitenbreite * (Seitenbreite - LinkerRand - RechterRand)
- Hoehe = GescanntesBild.Height / Seitenhoehe * (Seitenhoehe - ObererRand - UntererRand)
- OriginalbildBitmap.Dispose()
- Using OriginalbildBitmap As New Bitmap(Breite, Hoehe)
- FokusObjekt = Graphics.FromImage(OriginalbildBitmap)
- FokusObjekt.Clear(Color.White)
- FokusObjekt.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
- FokusObjekt.DrawImage(GescanntesBild, New Rectangle(X1, Y1, Breite, Hoehe))
- 'Das gescannte Bild wird in eine Bilddatei exportiert.
- OriginalbildBitmap.Save(Userverzeichnis & "\Scanner.png", ImageFormat.Png)
- FokusObjekt = Graphics.FromImage(FokusPuffer)
- End Using
- Else
- 'Das gescannte Bild wird in eine Bilddatei exportiert.
- GescanntesBild.Save(Userverzeichnis & "\Scanner.png", ImageFormat.Png)
- GescanntesBild.Dispose()
- End If
- Me.Text = Userverzeichnis & "\Scanner.png"
- 'Die Funktion "BildLaden" wird aufgerufen.
- BildLaden()
- OriginalbildAnzeigenMenue_Click(Me, EventArgs.Empty)
- BildUebersetzenMenue.Enabled = True
- HelligkeitScroll.Value = HelligkeitScroll.Maximum / 2
- OriginalbildEntladenMenue.Enabled = True
- Catch Fehler As Exception
- FrageFormular.Text = "Fehler"
- FrageFormular.Label1.Text = "Es ist ein Fehler beim Scannen aufgetreten. Schliessen Sie PunktBilder und starten das Programm erneut. Wenn der Fehler erneut auftritt, starten Sie den Computer neu und wiederholen Sie den Scanvorgang"
- FrageFormular.NeinBefehl.Visible = False
- FrageFormular.JaBefehl.Text = "OK"
- FrageFormular.ShowDialog()
- FrageFormular.Dispose()
- Exit Sub
- End Try
- Else
- FrageFormular.Text = "Hinweis"
- FrageFormular.Label1.Text = "Es wurde kein Bild erkannt"
- FrageFormular.NeinBefehl.Visible = False
- FrageFormular.JaBefehl.Text = "OK"
- FrageFormular.ShowDialog()
- FrageFormular.Dispose()
- Exit Sub
- End If
- End Sub
Nun die Funktion, die ein Bild mehrmals nacheinander speichern kann, ohne wegen eines angeblichen Zugriffs einer anderen Prozedur abzubrechen:
VB.NET-Quellcode
- Public Sub BildSpeichern(Bild As String)
- 'Diese Funktion öffnet das Datei-SpeichernDialogfeld. Wurde eine Datei
- 'ausgewählt oder angegeben, so wird geprüft, ob die Datei schon vorhanden ist.
- 'Wenn dies der Fall ist, wird der Benutzer gefragt, ob diese Datei überschrieben
- 'werden soll. Antwortet der Benutzer mit "Ja" so wird die Funktion "BildSpeichern"
- 'mit einem entsprechenden Parameter aufgerufen.
- DateiSpeichernDialog.Filter = "Bilddateien (*.bmp, *.jpg, *.jpeg, *.gif)|*.bmp;*.jpg;*.jpeg;*.gif"
- DateiSpeichernDialog.Title = Bild
- If DateiSpeichernDialog.ShowDialog = DialogResult.OK Then
- Breite = Seitenbreite - LinkerRand - RechterRand
- Hoehe = Seitenhoehe - ObererRand - UntererRand
- FokusPuffer.Dispose()
- FokusPuffer = New Bitmap(Breite, Hoehe)
- FokusObjekt = Graphics.FromImage(FokusPuffer)
- FokusObjekt.Clear(Color.White)
- If Bild = "Originalbild" Then
- FokusObjekt.DrawImage(OriginalbildBitmap, New Rectangle(0, 0, Breite, Hoehe))
- Else
- 'Ansonsten wird die Braillegrafik auf die zu exportierende Grafik übertragen.
- Using Ausgefuellt = New SolidBrush(Color.Black)
- Try
- X1 = 0
- Y1 = 0
- Do Until Y1 >= Zeilenzahl
- Do Until X1 >= ZeilenPunktzahl
- If PunktbildArray(X1, Y1) > HelligkeitScroll.Value Then
- FokusObjekt.FillEllipse(Ausgefuellt, New Rectangle((X1 * Punktgroesse) + (Punktgroesse * (Braillepunktgroesse / 10)), (Y1 * Punktgroesse) + (Punktgroesse * (Braillepunktgroesse / 10)), Punktgroesse * (1 - (Braillepunktgroesse / 5)), Punktgroesse * (1 - (Braillepunktgroesse / 5))))
- End If
- X1 = X1 + 1
- Loop
- X1 = 0
- Y1 = Y1 + 1
- Loop
- Catch myerror As Exception
- End Try
- End Using
- End If
- FokusPuffer.Save(DateiSpeichernDialog.FileName)
- FokusPuffer.Dispose()
- FokusPuffer = New Bitmap(SichtfensterPicture.ClientSize.Width, SichtfensterPicture.Height)
- FokusObjekt = Graphics.FromImage(FokusPuffer)
- End If
- End Sub
Wenn Jemand von euch eine Lösung hat, würde ich mich sehr über ein Beispiel freuen.
Vielen Dank schon mal im Voraus
*Code-Tag Formatierung korrigiert* ~NoFear23m
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()