Wie mache ich den ImageBuffer von Java, um eine PNG-Datei korrekt zu lesen?

9

Aus irgendeinem Grund funktioniert das Öffnen einiger PNG-Dateien mit ImageBuffer und ImageIO nicht. Hier ist ein Code, den ich für die Größenanpassung / das Zuschneiden von JPGs verwende:

%Vor%

Das Ziel dieser Funktion ist es, den gegebenen Typ zu übernehmen, die Größe zu ändern und das Bild zuzuschneiden und es dann unter dem gleichen Dateinamen in PNG zu speichern.

Es funktioniert unter Windows, aber wenn ich unter Linux (Lenny) zuschneide / skaliere, stürzt es komplett ab und beschwert sich über den Typ der Datei (es heißt, der Typ ist 0).

%Vor%

Lösungen?

Gibt es eine andere Bibliothek, die ich insgesamt benutzen kann?

    
egervari 29.04.2011, 18:51
quelle

3 Antworten

4

Wenn ich meine Funktion unter Windows ausführe, gibt croppedImage.getType () den Wert 5 zurück. Der einfache "Hack" ist also, den Typ zu speichern, zu prüfen, ob er 0 ist ... und falls ja, setze den Wert bis 5 manuell.

%Vor%

Wir übergeben dann stattdessen imageType und es sollte unter Linux funktionieren.

Ich bin mir sicher, dass dies den Nachteil hat, dass, wenn der Wert in anderen Fällen 0 ist, er auf 5 gesetzt wird und das ist falsch. Dies scheint jedoch für gängige Image-Typen unter Linux zu funktionieren und hat keine Probleme verursacht.

Es ist ziemlich klar, dass die Windows-Version von Java 1.6 völlig in Ordnung ist, aber die Linux-Version hat einen Fehler darin.

    
egervari 30.04.2011 12:04
quelle
1

Egervari, Sie können eine Bibliothek wie imgscalr (Apache 2) verwenden Mach die ganze Größenanpassung für dich "richtig", die Probleme wie diese mit einem Problem behebt sehr einfache API - es wird nicht mit dem Zuschneiden helfen, aber die Größenanpassung ist, was es am besten tut (verschiedene Geschwindigkeiten, Qualitäten, sogar Anti-Aliasing, wenn Sie wollen).

Ich möchte darauf hinweisen, dass der Code, den Sie jetzt verwenden (erzwingt einen CUSTOM-Typ in einen 3BYTE_BGR-Typ), auch eingehende Bilder mit einem Alphakanal berücksichtigen sollte.

Auch wenn Sie Ihren benutzerdefinierten Code weiterhin verwenden möchten, sind RGB und ARGB zwei der am besten unterstützten Bildtypen in Java2D. Wenn Sie einen schlecht unterstützten Bildtyp verwenden, greift Java2D bei der Ausführung des Bilds zurück zu seiner Software-Rendering-Pipeline und verwendet nicht die speziellen hardwarebeschleunigten. Dies wirkt sich nicht nur auf die Leistung aus, da das Ergebnis tatsächlich schlechter aussieht (z. B. in GIF, das sehen Sie oft).

Auch imgscalr kümmert sich automatisch um all das für Sie, wenn Sie es versuchen wollten, aber wenn nicht, dachte ich mir, ich würde Ihnen nur einen Kopf geben, wenn Sie einige dieser Kopfschmerzen haben.

>

Java-Bildverarbeitung ist ... temperamentvoll:)

    
Riyad Kalla 05.07.2011 17:11
quelle
0

Eine Umgehungslösung wäre, die Datei zuerst in jpeg zu konvertieren und dann zu verarbeiten. Der Fehler vom Typ 0 scheint hauptsächlich PNG-Bilder zu beeinflussen.

    
wrinkl3 10.07.2017 11:38
quelle