
Java의 Util 클래스 :
일반적으로 공통적으로 자주 쓰는 기능(함수)을 정리해 놓은 유틸리티 클래스 (JS의 라이브러리와 유사)
유틸리티 클래스에서 '이미지 아이콘을 로드하고, 크기를 조절해 반환하는 메서드'를 정의하여 사용하기 쉽게 처리해두자!
package util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
public class ImageUtil {
/* 클래스패스(classpath)에 포함된 이미지 파일을
지정한 크기로 불러와 Icon으로 반환 */
public Icon getIcon(String filename, int width, int height) { // static 없으므로 new 해야함
Class myClass = getClass(); // 현재 클래스의 참조
URL url = myClass.getClassLoader().getResource(filename); // 클래스패스에서 리소스 찾기
ImageIcon icon = null;
try {
// 원본 이미지 로드
BufferedImage buffrImg = ImageIO.read(url);
// 크기 조절된 이미지 생성
Image img = buffrImg.getScaledInstance(width, height, Image.SCALE_SMOOTH);
// 아이콘 생성
icon = new ImageIcon(img);
} catch (IOException e) {
e.printStackTrace();
}
return icon;
}
}
ImageUtil imageUtil;
public ShopMain() {
imageUtil = new ImageUtil();
bt_home = new JButton(imageUtil.getIcon("home.png", 30, 30));
bt_product = new JButton(imageUtil.getIcon("product.png", 30, 30));
bt_mypage = new JButton(imageUtil.getIcon("mypage.png", 30, 30));
bt_cs = new JButton(imageUtil.getIcon("cs.png", 30, 30));
사용은 이렇게 버튼 생성 시 매개변수로 파일명, 너비, 높이 넘기기
URI (Uniform Resource Identifier) :
자원 자체를 식별하기 위한 문자열 (이름이든, 위치든).
URL (Uniform Resource Locator) :
URI의 하위 개념으로, 자원이 어디 있는지(위치)를 구체적으로 나타냄
URI :
mailto:hjin3456@naver.com← 위치가 아니라 식별자 (메일 주소)
URL :https://velog.io/@hjin3456← 위치 + 접속 방식까지 포함
Class myClass = this.getClass();
URL url = myClass.getClassLoader().getResource("home.png");
→ 이 두 줄의 최종 목적은
클래스패스 기준으로 home.png 라는 파일의 URL을 얻기 위함
getClassLoader() : 클래스패스를 기준으로 리소스를 찾음getResource() : 클래스패스 기준으로 파일을 찾음| 구성 | 의미 |
|---|---|
getClass() | 현재 클래스 정보 얻기 |
getClass().getClassLoader() | 이 클래스가 메모리에 올라올 때 사용된 클래스 로더 얻기 |
getResource("파일명") | 클래스패스를 기준으로 파일 위치를 찾아 URL로 반환 |
현재 클래스의 클래스 로더를 통해, 클래스패스에 있는 리소스의 URL을 반환
✅ ImageIcon 자체는 크기를 지정할 수 없으므로,
아이콘 사용에 앞서 크기 조절이 가능한 이미지를 먼저 얻어야 함
➡ BufferedImage
BufferedImage buffrImg = ImageIO.read(url); //(1)
Image img = buffrImg.getScaledInstance(width, height, Image.SCALE_SMOOTH); //(2)
icon = new ImageIcon(img); //(3)
(1) 👉 ImageIO.read()를 이용해 URL형식의 이미지 파일을 BufferedImage로 읽어들임 (BufferedImage 반환)
BufferedImage와 (Toolkit으로 얻은) Image의 차이점
Toolkit으로 얻는 Image는
단순하게 화면에 보여줄 용도
BufferedImage는 내부 픽셀 데이터까지 접근 가능
➡ 이미지 가공, 크기 조절, 워터마크 처리 등 섬세하고 기술적인 이미지 제어 가능
(2) 👉 getScaledInstance() 는 간단하게 사이즈를 줄이거나 늘릴 수 있음 (Image 반환)
(2) 👉Image.SCALE_SMOOTH : "부드럽게 크기 조절해라"
(속도 느리고, 품질 높음)
(3) 👉 크기 조절된 Image를 기반으로 ImageIcon을 생성