2016-04-03 18 views
0

Meine Firma hat eine EJB, die versucht, ein Graustufen-TIFF-Bild (das in eine RenderedImage gelesen wird) in ein PNG-Bild durch PNGImageEncoder.encode zu konvertieren.JAI-Codec PNGImageEncoder löst Division durch Null Ausnahme

Heute habe ich gelernt, dass es, unter Umständen, die ich nicht weiß (ich war nicht der Autor, und ich bin nicht anwesend auf der Testseite), eine Division durch Null Ausnahme. Ich fand es ungewöhnlich, dass es von PNGImageEncoder geworfen wurde. Der Versuch, online nach dem Problem zu suchen, hat nichts Nützliches gebracht.

Die Ausnahme:

java.lang.ArithmeticException: divide by zero 
    at com.sun.media.jai.codecimpl.PNGImageEncoder.encodePass(PNGImageEncoder.java:367) 
    at com.sun.media.jai.codecimpl.PNGImageEncoder.writeIDAT(PNGImageEncoder.java:476) 
    at com.sun.media.jai.codecimpl.PNGImageEncoder.encode(PNGImageEncoder.java:1026) 
    at com.nameOfMyCompany.SomeProgram.writePNG(SomeProgram.java:555) 

Bei der weiteren Untersuchung, wie ich vermute, dass die TIFF-Bilder verwendet (was ich keinen Zugang zu haben) haben die Bittiefe aus irgendeinem Grunde auf 0 gesetzt (ImageEncoder code). PNGImageEncoder.encodePass kann samplesPerByte nicht berechnen, und die Ausnahme wird ausgelöst.

Meine Frage: Habe ich recht, wenn ich vermute, dass die TIFF-Bilder der Grund dafür sind? Was könnte sonst die obige Ausnahme verursachen?

+0

Dies ist meine erste Post in StackExchange (obwohl ich hier für eine ganze Weile lauerte). Die Formatierung meiner Frage passt möglicherweise nicht gut genug zu der Website. Entschuldigung, wenn das der Fall ist. –

+0

TIFF ist ein ziemlich altes Format, und im Laufe der Jahre haben sich die Spezifikationen und die erforderlichen/optionalen Tags unglaublich erweitert. Es ist möglich, dass es eine Kombination von grundlegenden Eigenschaften-Tags gibt, die es für andere Software "gültig" machen, aber nicht für die Bibliothek, die Sie zum Lesen verwenden (welche?). Am besten ist es, die ursprüngliche TIFF-Datei in die Hände zu bekommen, damit Sie die Ursache ermitteln können. – usr2564301

+0

@ rad-lexus Das 'RenderedImage' wurde von' com.sun.media.jai.codec.ImageDecoder.decodeAsRenderedImage' erstellt. Weitere Erkenntnisse meines Kollegen deuten darauf hin, dass es sich nicht um die Probleme der TIFF-Dateien und des Java-Codes handelt. Ich habe mich dann auf andere Dinge zu arbeiten, aber ich kann dies aktualisieren, wenn die Ursache genau bestimmt werden kann. –

Antwort

0

Ihre Frage ist ja/nein, also ist die Antwort ja, da die Zeile dort eine Division anzeigt, die bedeutet, dass es eine Division gibt und wahrscheinlich durch Null, wenn der Fehler es so sagt.

Darüber hinaus sagen Sie "(was in ein RenderedImage eingelesen wird)": kann dies in Java angezeigt werden (können Sie ein jpanel erstellen und dieses RenderedImage anzeigen?)? Wenn ja, können Sie einen anderen Mechanismus (ImageIO) verwenden, um das Renderable in png umzuwandeln (und dieses Programm zu überspringen, das Sie verwenden). Wenn nicht, beginnt der lange Prozess der TIFF-Untersuchung.