Java Swing에서 ImageIcon 클래스는 Image 객체로부터 아이콘을 그려주는 Icon 인터페이스의 구현체입니다. 이 클래스를 사용하면 Swing 윈도우에 손쉽게 이미지를 표시할 수 있으며, 생성자는 BufferedImage 객체를 매개변수로 받습니다.
따라서 OpenCV에서 Mat 객체로 저장된 이미지를 Swing 윈도우에 표시하려면 다음과 같은 과정이 필요합니다.
핵심 처리 순서
1. Imgcodecs.imread()로 파일을 읽어 Mat 객체를 생성합니다.
2. Imgcodecs.imencode()를 이용해 Mat 객체를 JPEG 형식으로 인코딩합니다.
3. 인코딩된 데이터를 바이트 배열로 변환한 뒤, InputStream을 통해 BufferedImage 객체로 변환합니다.
4. 변환된 BufferedImage를 ImageIcon으로 감싸 JLabel에 넣고 JFrame에 추가하면 화면에 이미지가 표시됩니다.
예제 코드
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
public class DisplayingImagesUsingSwings {
public static void main(String args[]) throws Exception {
// OpenCV 핵심 라이브러리 로드
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
// 파일에서 이미지 읽기
String file = "D:\\images\\tree.jpg";
Mat image = Imgcodecs.imread(file);
// 이미지 인코딩
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", image, matOfByte);
// 인코딩된 Mat을 바이트 배열에 저장
byte[] byteArray = matOfByte.toArray();
// BufferedImage 준비
InputStream in = new ByteArrayInputStream(byteArray);
BufferedImage bufImage = ImageIO.read(in);
// JFrame 생성
JFrame frame = new JFrame();
// JFrame에 콘텐츠 설정
frame.getContentPane().add(new JLabel(new ImageIcon(bufImage)));
frame.pack();
frame.setVisible(true);
System.out.println("Image Loaded");
}
}실행 결과
위 프로그램을 실행하면 다음과 같이 지정한 이미지가 Swing 창에 정상적으로 나타나며, 콘솔에는 'Image Loaded' 메시지가 출력됩니다.
