Behebung eines generischen Fehlers in GDI + beim Erzeugen eines Barcodes

8

Ich schreibe einen Barcode-Generator in C # Ich kann Barcodes als Bitmaps generieren und in einer Picturebox (WindowsForms) anzeigen. Auf der anderen Seite konnte ich meinen Barcode nicht als gif oder jpeg Datei speichern. Mein Barcode ist eine Bitmap-Datei und hier ist mein Code

%Vor%

Ich bekomme die folgende Ausnahme; In GDI + ist ein allgemeiner Fehler aufgetreten.

    
boraer 22.07.2010, 11:18
quelle

5 Antworten

5

Hinweis: Der Titel ist irreführend, da kein Problem beim Erstellen von BarCodes beschrieben wird, sondern das Speichern von Bildern / Bitmaps. Ich kann nur annehmen, dass Herr Puthiyedath, der Kopfgeldgeber, den gleichen Fehler hat, da keine weiteren Informationen bereitgestellt werden.

Das generic error occurred in GDI+ -Problem bedeutet normalerweise eines von zwei Dingen:
A) Sie versuchen, in eine Datei zu schreiben, in der bereits ein Bitmap-Bild geöffnet ist. Von MSDN :

  

Das Bild in derselben Datei zu speichern, aus der es erstellt wurde, ist nicht erlaubt und löst eine Ausnahme aus.

Wenn Sie also an einer anderen Stelle in der App eine Bitmap haben, die aus einer Datei erstellt wurde, können Sie nicht in derselben Datei speichern, bis die Bitmap entfernt wurde. Die offensichtliche Lösung besteht darin, ein neues Bitmap zu erstellen und es zu speichern.

B) Sie haben möglicherweise keinen Zugriff auf den Ordner / die Datei

Dies ist das wahrscheinliche Problem , da die Ausführung von File IO in einer Datei im Stammordner des Startlaufwerks (wie im OP-Beispielcode) je nach Betriebssystem nicht zulässig ist. Sicherheitseinstellungen, Berechtigungen etc etc usw.

Wenn ich im folgenden Code versuche, in "C:\ziggybarcode.gif" anstatt im Ordner \Temp zu speichern, passiert nichts . Es gibt keine Ausnahme, aber es wird auch kein Bild erstellt. Unter anderen Bedingungen kann eine Ausnahme auftreten, die jedoch häufig als generischer Fehler gemeldet wird. Lösung: Verwenden Sie den Stammordner nicht für Dateien. Users\USERNAME\... ist nur für diesen Zweck vorgesehen.

C) Der Ordner / Dateiname darf nicht legal sein

Wenn der Dateiname im Code erfunden ist, kann es sein, dass die Datei oder der Pfad illegal ist. Testen Sie dies mit einem literalen, legalen Pfad wie @"C:\Temp\mybarcode.gif" (lassen Sie den @ für VB aus).

Verwenden Sie Path.Combine() , um einen legalen Pfad zu erstellen. und stellen Sie sicher, dass der Dateiname keine unzulässigen Zeichen enthält.

Eine weitere Ausnahme, die manchmal auftritt und von Interesse sein könnte, ist Ausnahme wegen nicht verfügbarem Speicher . Dies bedeutet normalerweise, dass ein Problem mit dem Bildformat vorliegt. Ich habe ein paar Apps, die viel an Bildern arbeiten und feststellen, dass es problematisch ist, das Format zu verfolgen oder vorausgesetzt dass ein Bild in einem bestimmten Format gespeichert werden kann auf einem bestimmten Computer . Ein BarCode-Generator könnte ein ähnliches Problem haben.

Für einfache Anwendungen oder solche, die nur mit einem einzigen Standardformat arbeiten, ist die einfache Bitmap.Save Methode oft in Ordnung:

%Vor%

Aber wenn Ihre App verschiedene Formate jongliert, ist es möglicherweise besser, das Bild explizit zu codieren:

%Vor%

Fügen Sie sie in eine DLL ein oder machen Sie sie zu Erweiterungen, und es wird genauso einfach, mit ihnen zu arbeiten:

%Vor%

Besonders bei der Arbeit mit JPGs wird es besonders einfach, den Komprimierungs- / Qualitätsparameter zu verwalten. Ich sage nicht, dass dies die bevorzugte Methode ist, nur dass ich in komplexen Apps viel weniger Probleme hatte, indem Bilder explizit kodiert wurden.

Testcode zum Erstellen eines BarCode GIF:

%Vor%

Der letzte Fehler schlägt mit Generic GDI error fehl, obwohl wie aussieht, sollte es eine mit IO oder UnAuthorizedAccess zusammenhängende Ausnahme sein.

Ausgabe:

Das erste und letzte Bild wird nicht gespeichert, aus den oben beschriebenen Gründen und in Code-Kommentaren.

    
Plutonix 24.12.2014 17:21
quelle
1

Ich hatte dieses Problem zuvor und konnte es mithilfe eines Bitmap-Zwischenobjekts lösen, etwa so:

%Vor%

Ich habe diese Lösung / Workaround gefunden hier

Der Grund ist, weil "Sie versuchen, in eine Datei zu schreiben, auf der bereits ein Bitmap-Bild geöffnet ist", wie zuvor erwähnt.

    
Rolo 25.12.2014 02:02
quelle
0

Gif ist ein indiziertes Palettenformat.

Speichern Sie es in einem kompatiblen Format, das zum Erstellen der Bitmap -Instanz verwendet wurde.

    
leppie 22.07.2010 11:25
quelle
0

Ihr Problem ist Berechtigungen. Erlauben Sie dem Netzwerkdienst vollen Zugriff auf den Pfad, in dem Sie die Datei speichern, und sehen Sie, ob das hilft

viel Glück!

    
Ugene 22.07.2010 19:32
quelle
0

Sie können Aspose.BarCode für .NET auch. Diese Komponente ermöglicht es Ihnen, Barcodes von Grund auf neu zu erstellen und mit vorhandenen Barcodes arbeiten. Es bietet eine große Flexibilität, um eine Vielzahl von Barcode-Bildern zu erstellen. Sie können es mit jeder Art von .NET-Anwendung verwenden. Bitte versuchen Sie an Ihrem Ende und sehen Sie, ob dies in Ihrem Szenario helfen könnte.

Offenlegung: Ich arbeite als Entwickler-Evangelist bei Aspose.

    
Shahzad Latif 18.10.2011 14:24
quelle

Tags und Links