Stack:
- Java - 1.8.0_91
- Scala - 2.11.8
- Library - it.geosolutions.imageio-ext imageio-ext-tiff 1.1.15
We are reading lots of old TIF images and for some reason read is highly inconsistent - for some reasons on a different run reading the same image can succeed or fail with exception -
javax.imageio.IIOException: Invalid component ID 3 in SOS
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1236)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1039)
at com.sun.media.imageioimpl.plugins.tiff.TIFFOldJPEGDecompressor.decodeRaw(TIFFOldJPEGDecompressor.java:654)
at com.sun.media.imageio.plugins.tiff.TIFFDecompressor.decode(TIFFDecompressor.java:2527)
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.decodeTile(TIFFImageReader.java:1137)
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.read(TIFFImageReader.java:1417)
The code is something like this:
import java.io.{ByteArrayInputStream, ByteArrayOutputStream}
import javax.imageio.ImageIO
def convertToPng(data: Array[Byte]): Array[Byte] = {
val inputStream = new ByteArrayInputStream(data)
val image = ImageIO.read(inputStream)
val outputStream = new ByteArrayOutputStream(inputStream.available())
ImageIO.write(image, "png", outputStream)
outputStream.toByteArray
}
The problem is ImageIO initializes 2 TIFF readers at the same time
com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader &
it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReader
OR
it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReader
com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader
The first one fails, the second one works. How to exclude com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader from ImageIO configuration?
See Question&Answers more detail:os