Convert JPEG2000 image in byte[] to BufferedImage object

819 Views Asked by At

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
0

There are 0 best solutions below