Есть ли способ сохранить изображение 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