Мой сын работает над проектом Java для отображения изображений JPEG2000 из файла.В этом конкретном случае изображения JPEG2000 основаны на профиле широковещания, который используется в стандарте TR-01 Форума видеоуслуг для транспортировки видео JPEG2000.
Он основывает свой код на другом примере, найденном здесь:
Как отобразить изображение jpeg2000 на Jframe?
, но возникают проблемы с отображениемэтот конкретный формат файла.Другие примеры файлов изображений, такие как Профиль 1 или 2, работают, но не Профиль вещания.Формат файла, который он пытается отобразить, прекрасно работает со средством просмотра Kakadu, поэтому кажется, что профиль трансляции не поддерживается.У кого-нибудь есть опыт отображения файлов Broadcast Profile из Java.
Редактировать: С тех пор он нашел другой способ сделать это (вызывая openjpeg "opj_decompress" извне для преобразования из JPEG2000 в bmp), но это в основном кодон пытался.Было бы неплохо, если бы он работал лучше, чем при использовании внешней функции:
package javaapplication1;
import java.awt.GridLayout;
import java.io.File;
import java.io.IOException;
import javax.imageio.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import jj2000.j2k.*;
import com.sun.media.imageioimpl.plugins.jpeg2000.*;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
/**
*
*/
public class JavaApplication1 {
public static JFrame mainFrame;
public static JLabel headerLabel;
public static JLabel statusLabel;
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
// TODO code application logic here
prepareGUI();
//JLabel hold = new JLabel("hold");
}
private static void prepareGUI() throws IOException{
J2KImageReaderSpi j2kspi = new J2KImageReaderSpi();
J2KImageReader j2kImageReader = new J2KImageReader(j2kspi);
mainFrame = new JFrame("Java Swing Examples");
mainFrame.setSize(1000,1000);
mainFrame.setLayout(new GridLayout(3, 8));
headerLabel = new JLabel("", JLabel.CENTER);
try (ImageInputStream input = ImageIO.createImageInputStream(new File("file1.j2k")))
{
j2kImageReader.setInput(input);
ImageReadParam imageReadParam = j2kImageReader.getDefaultReadParam();
BufferedImage image = j2kImageReader.read(0, imageReadParam);
ImageIcon imgIcon = new ImageIcon(image);
JLabel label = new JLabel(imgIcon);
mainFrame.add(label);
mainFrame.add(headerLabel);
//mainFrame.add(statusLabel);
mainFrame.setVisible(true);
}
}
}
Выдаются следующие ошибки:
Exception in thread "main" java.lang.RuntimeException: Codestream capabiities not JPEG 2000 - Part I compliant
at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.initializeRead(J2KReadState.java:696)
at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.<init>(J2KReadState.java:189)
at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader.read(J2KImageReader.java:443)
at javaapplication1.JavaApplication1.prepareGUI(JavaApplication1.java:60)
at javaapplication1.JavaApplication1.main(JavaApplication1.java:37)
Caused by: java.lang.Error: Codestream capabiities not JPEG 2000 - Part I compliant
at jj2000.j2k.codestream.reader.HeaderDecoder.readSIZ(HeaderDecoder.java:527)
at jj2000.j2k.codestream.reader.HeaderDecoder.readFoundMainMarkSeg(HeaderDecoder.java:2164)
at jj2000.j2k.codestream.reader.HeaderDecoder.<init>(HeaderDecoder.java:2368)
at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.initializeRead(J2KReadState.java:423)
... 4 more