2015-02-22 14 views
9

Ich verwende Java 8 (speziell OpenJDK 8) für ein Projekt und ich muss ein Bild aus einer JPG-Datei lesen. Die Suche führte mich zu einigen ähnlichen Fragen (z. B. Read byte array into buffered image WITHOUT ImageIO und Is there a 100% Java alternative to ImageIO for reading JPEG files?), aber mein Problem ist anders und die Lösungen dort entsprechen nicht meinen Anforderungen.Workaround für ImageIO.read Fehler in OpenJDK 8?

Es stellt sich heraus, dass die Klasse JPEGImageReader immer noch fehlt. (Siehe openjdk-8: Missing JPEGImageReader functions in libjavajpeg.so) Obwohl dieser Fehlerbericht für Debian ist, verwende ich Kubuntu 14.10 und es ist auch betroffen.

Basierend auf dem letzten Nachricht Bericht, scheint niemand zu diesem Zeitpunkt zu diesem Thema zu funktionieren ...

Der Code-Schnipsel, diesen Fehler zu reproduzieren ist:

// ... 
BufferedImage img = null; 
try { 
    img = ImageIO.read(new File(filename)); 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 
// ... 

Der Weg zu dem Datei gültig ist und das funktioniert in der Regel, wenn ich Java verwenden 1.7, aber auf 1,8 ändert, verursacht die folgende excpetion auf ImageIO.read Aufruf:

Caught UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageReader.initReaderIDs(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;) 

ich benötige Hilfe ein Arbeits rund um dieses Problem unter Vermeidung:

  1. zusätzliche Abhängigkeiten zu anderen/externen Bibliotheken;
  2. Zurück zu Java 1.7;
  3. muss aus der Quelle neu erstellt werden;
  4. Oracle-eigene Implementierung der JDK

Arbeits Code-Schnipsel geschätzt.

EDIT-1: Punkt # 4 zur Liste hinzugefügt.

EDIT-2: Ein Teil des Hauptabschnitts rewordiert und eine weitere Referenz hinzugefügt.

+0

Ist die Verwendung des Oracle JDK eine Möglichkeit? Wenn ja, gibt es einige Informationen hier auf einem ppa, die Sie verwenden können: http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html – msandiford

+0

ich bin Versuchen, sich von Oracles proprietärer Implementierung fernzuhalten, wenn irgend möglich. Ich werde die Frage aktualisieren, um dies zu erwähnen. – ray

+0

Also [ImageIO.getImageReadersByFormatName ("jpeg")] (http://docs.oracle.com/javase/8/docs/api/javax/imageio/ImageIO.html#getImageReadersByFormatName-java.lang.String-) ergibt keinen JPEG-Reader? –

Antwort

3

Ich glaube, das hat sich nun ab 17. März 2015 Release, per Matthias Klose email fest:

Source: openjdk-8 Source-Version: 8u40-b27-1

We believe that the bug you reported is fixed in the latest version of openjdk-8, which is due to be installed in the Debian FTP archive.

A summary of the changes between this version and the previous one is attached.

Thank you for reporting the bug, which will now be closed. If you have further comments please address them to [email protected], and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software pp. Matthias Klose (supplier of updated openjdk-8 package)

(This message was generated automatically at their request; if you believe that there is a problem with it please contact the archive administrators by mailing [email protected])

+0

Ich habe die E-Mail gestern gesehen, aber ich habe noch nicht gesehen, dass ein Paketupdate in den Repositories zur Verfügung gestellt wurde oder Zeit hatte, es auszuprobieren. Ich werde dies aktualisieren, nachdem ich es selbst ausprobiert habe. – ray

+0

Ich habe bestätigt, dass die Pakete aktualisiert und heute verfügbar gemacht wurden, mit Java-8-openjdk-amd64 von Kubuntu 15.04. – ray

1

Sie könnten install die Java Advanced Imaging libraries, die auch eine JPEG-Implementierung (und andere Codec) bietet.

+0

Danke für den Vorschlag, aber das geht gegen Punkt # 1, der explizit versucht, zusätzliche Abhängigkeiten von externen Bibliotheken zu vermeiden. Die Installation des JAI macht genau dies. – ray

3

Ist die Verwendung des Oracle JDK eine Möglichkeit?

Wenn ja, gibt es einige Informationen here auf einem PPA, die Sie mit Ubuntu verwenden können.

1

ich hier das Problem mit der Tatsache, ist der Meinung, dass das erzeugte Bild im JPEG-Format ist. Sobald ich es im PNG-Format generiert hatte, wurde das Problem gelöst. Ich habe Grabzit API verwendet, um Screenshot zu erfassen und es im PNG-Format gespeichert

+0

Es ist nicht das Format. Es gab einen Fehler, bei dem die interne Klasse zum Lesen von JPEGs aus dem Paket fehlte. – ray

+0

Got it ray. Könnten Sie mir also zeigen, welche Klasse fehlte und wenn Sie die JAR-Datei kennen, könnten Sie das auch erwähnen. Danke –

+0

Die Details des OP haben die Antwort auf Ihre Frage. – ray