Преобразовать изображение JPEG2000 в байтах [] в объект BufferedImage - PullRequest
0 голосов
/ 22 апреля 2020

Есть ли способ сохранить изображение JPEG2000, полученное в байтовом массиве, в объект BufferedImage в Java? Следующий код не работает. imageBytes - это байтовый массив.

BufferedImage bfi = ImageIO.read(new ByteArrayInputStream(imageBytes)); 

Я пытался использовать библиотеки jai-imageio-jpeg2000 и jai-imageio-core, но не мог понять, как получить массив байтов, сохраненный в BufferedImage. Каждый раз, когда я получаю объект BufferedImage как ноль.

Это код, который я использую в настоящее время:

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
    }

РЕДАКТИРОВАТЬ:

Я изменил код в readJPEG2000Image () на

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
        }
    }

и я получил исключение

Файл не является ни действительным файлом JP2, ни действительным кодовым потоком JPEG 2000

Используемый массив байтов является допустимым массивом JPEG2000 , Не уверен, почему генерируется это сообщение.

Трассировка стека:

    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
...