Is there any way to store JPEG2000 image being received in byte array into a BufferedImage object in Java? The following code does not work. imageBytes is the byte array.
BufferedImage bfi = ImageIO.read(new ByteArrayInputStream(imageBytes));
I tried to use jai-imageio-jpeg2000 and jai-imageio-core libraries but couldn't figure out how to get the byte array stored into BufferedImage. Every time I get BufferedImage object as null.
This is the code I am using currently:
public static File readJ2GImage(byte[] imageBytes, String fileName, boolean isLossless) throws IOException {
final File file = File.createTempFile(fileName,".jp2");
Iterator<ImageWriter> writerIterator = ImageIO.getImageWritersBySuffix("jp2");
if(writerIterator.hasNext()){
final ImageWriter imageWriter = writerIterator.next();
final J2KImageWriteParam writeParams = (J2KImageWriteParam)imageWriter.getDefaultWriteParam();
writeParams.setLossless(isLossless);
ImageOutputStream ios = ImageIO.createImageOutputStream(file);
final BufferedImage image = readJPEG2000Image(imageBytes);
imageWriter.setOutput(ios);
imageWriter.write(null, new IIOImage(image, null, null), writeParams);
imageWriter.dispose();
ios.close();
return file;
}else {
//Exception
}
}
public static BufferedImage readJPEG2000Image(byte[] imageBytes) throws IOException {
Iterator<ImageReader> imageReaderIterator = ImageIO.getImageReadersBySuffix("jp2");
if(imageReaderIterator.hasNext()){
final ImageReader imageReader = imageReaderIterator.next();
final Object source = new ByteArrayInputStream(imageBytes);
final ImageInputStream imageInputStream = ImageIO.createImageInputStream(source);
return ImageIO.read(imageInputStream);
}else {
//Exception
}
EDIT:
I changed the code in readJPEG2000Image() to
public static BufferedImage readJPEG2000Image(byte[] imageBytes) throws IOException {
Iterator<ImageReader> imageReaderIterator = ImageIO.getImageReadersBySuffix("jp2");
if(imageReaderIterator.hasNext()){
final ImageReader imageReader = imageReaderIterator.next();
final ImageInputStream imageInputStream = ImageIO.createImageInputStream(new ByteArrayInputStream(imageBytes));
imageReader.setInput(imageInputStream);
final BufferedImage bfi = imageReader.read(0);
return bfi;
}else {
//Exception
}
}
and I received exception
File is neither valid JP2 file nor valid JPEG 2000 codestream
Byte array used is a valid JPEG2000 array. Not sure why this message is being thrown.
Stack trace:
java.lang.RuntimeException: File is neither valid JP2 file nor valid JPEG 2000 codestream
at com.github.jaiimageio.jpeg2000.impl.J2KReadState.initializeRead(J2KReadState.java:682)
at com.github.jaiimageio.jpeg2000.impl.J2KReadState.<init>(J2KReadState.java:175)
at com.github.jaiimageio.jpeg2000.impl.J2KImageReader.read(J2KImageReader.java:430)
at javax.imageio.ImageReader.read(ImageReader.java:939)
at com.snapdeal.mob.aadhaar.parser.TypeUtil.readJPEG2000Image(TypeUtil.java:164)
at com.snapdeal.mob.aadhaar.parser.TypeUtil.readJ2GImage(TypeUtil.java:144)
at com.snapdeal.mob.aadhaar.template.impl.AadhaarTemplateServiceImpl.generateImage(AadhaarTemplateServiceImpl.java:45)
at com.snapdeal.mob.service.impl.MerchantServiceImpl.readAadhaar(MerchantServiceImpl.java:5067)
... 122 more
Caused by: java.lang.Error: File is neither valid JP2 file nor valid JPEG 2000 codestream
at jj2000.j2k.fileformat.reader.FileFormatReader.readFileFormat(FileFormatReader.java:183)
at com.github.jaiimageio.jpeg2000.impl.J2KReadState.initializeRead(J2KReadState.java:404)
... 129 more