이미지를 (JLabel 내에서) ImageIcon으로 읽고 표시하는 응용 프로그램을 작성 중이므로 응용 프로그램이 jpeg 및 비트 맵을 지원할 수 있어야합니다.Java : 이미지 읽기 및 ImageIcon으로 표시
jpegs의 경우 ImageIcon 생성자에 파일 이름을 직접 전달하는 것이 좋습니다 (심지어 두 개의 대형 jpeg를 표시하는 경우에도). ImageIO.read를 사용하여 이미지를 얻은 다음 이미지를 ImageIcon 생성자에 전달하면 두 번째 이미지를 읽을 때 (이전과 같은 이미지를 사용하여) OutOfMemoryError (Java 힙 공간)를 가져옵니다.
비트 맵의 경우 파일 이름을 ImageIcon에 전달하여 읽으려고하면 아무 것도 표시되지 않지만 ImageIO.read로 이미지를 읽은 다음 ImageIcon 생성자에서이 이미지를 사용하면 문제가 없습니다.
다른 포럼 게시물을 읽는 중 두 가지 방법이 서로 다른 형식으로 동일하게 작동하지 않는 이유는 자바의 비트 맵 호환성 문제와 관련이 있습니다. 그러나 내 문제를 해결할 수있는 방법이 있습니다. OutOfMemoryError가없는 비트 맵과 jpeg 모두 동일한 방법?
(내가 힙 크기 가능하면 증가하는 것을 피하기 싶습니다!)
을 OutOfMemoryError가이 선으로 트리거 :
img = getFileContentsAsImage(file);
과 방법을 정의하는 것입니다 :
public static BufferedImage getFileContentsAsImage(File file) throws FileNotFoundException {
BufferedImage img = null;
try {
ImageIO.setUseCache(false);
img = ImageIO.read(file);
img.flush();
} catch (IOException ex) {
//log error
}
return img;
}
스택 추적은 다음과 같습니다.
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58)
at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
at java.awt.image.Raster.createWritableRaster(Raster.java:938)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:925)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:897)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
at framework.FileUtils.getFileContentsAsImage(FileUtils.java:33)
OutOfMemoryError를 트리거하는 샘플 코드를 게시하십시오. – Thomas