본문 바로가기

자바공부

자바 이미지 그리기, 명품자바프로그래밍12장

728x90
반응형

* 스윙에서 이미지를 출력하기 위해서는 다음 2가지 방법이 사용된다.

1) JLabel 컴포넌트를 이용한 이미지 출력

JLabel을 이용하여 이미지를 그리는 방법으로 이미지를 JLabel에 부착되어 패널에 출력된다.

ImageIcon image = new ImageIcon("image/apple.jpg");
JLabel label = new JLabel(image);
panel.add(label);

이 방법은 간편하고 쉽다는 장점이 있지만 이미지가 원본 크기로만 그려지는 단점이 있다.

 

2) JLabel에  Graphics의 메소드를 이용한 이미지 출력

Graphics의 이미지 그리그 메소드를 호출하여 원하는 위치에, 원하는 크기로, 원하는 비율로 이미지를 그리는 방법이다.

이 방법은 이미지의 원본 크기와 다르게 그릴 수 있는 장점이 있으나 개발자가 이미지를 그리는 몇 줄의 코드를 작성하여야 한다는 부담이 있다.

 

* JLabel로 이미지를 그리는 경우 이미지가 하나의 컴포넌트가 되므로 마우스로 이미지를 움직이거나 다른 컨테이너에 삽입하는 등 관리가 쉽다는 장점이 있다. 그러므로 이미지의 변환 등 이미지 처리를 위한 특별한 경우가 아니라면 JLabel을 이용하여 이미지를 출력하는 것이 좋다. 실제 JLabel의 생성자의 인자로 주어진 이미지는 JLabel의 paintComponent()에 의해 화면이 그려진다. 그러므로 JLabel을 상속받고 paintComponent()를 오버라이딩하여 이미지를 그리는 방법도 있다.

 

* 이미지를 그리는 Graphics 메소드는 총 6개이며 3가지 유형으로 구분된다.

1) 원본 크기로 이미지를 그리는 2개의 메소드

boolean drawImage(Image img, int x, int y, Color bgColor, ImageObserver observer)
boolean drawiamge(Image img, int x, int y, ImageObserver observer)
// img : 이미지 객체
// x, y : 이미지가 그려질 좌표
// bgColor : 이미지가 투명한 부분을 가지고 있을 때 투명한 부분에 칠해지는 색상
// observer : 이미지 그리기의 완료를 통보받는 객체
// image를 그래픽 대상 영역의 (x, y) 위치에 img의 원본 크기로 그린다.

2) 원본 이미지를 원하는 크기로 조절하여 그리는 2개의 메소드

boolean drawImage(Image img, int x, int y, int width, int height, 
	Color bgColor, ImageObserver observer)
boolean drawImage(Image img, int x, int y, int width, int height, 
	ImageObserver observer)
   
// width : 그려지는 폭으로서 픽셀 단위
// height : 그려지는 높이로서 픽셀 단위
// img를 그래픽 대상 영역의 (x, y) 위치에 width x height 크기로 조절하여 그린다.

 

3) 원본 이미지의 일부분만을 취하여 그 크기를 조절하여 그리는 2개의 메소드

boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
	int sx2, int sy2, Color bgColor, ImageObserver observer)
 boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
	int sx2, int sy2,ImageObserver observer)
// dx1, dy1 : 그려질 그래픽 대상 영역상의 왼쪽 상단 모서리 좌표
// dx2, dy2 : 그려질 그래픽 대상 영역상의 오른쪽 하단 모서리 좌표
// sx1, sy1 : 소스 이미지 내의 왼쪽 상단 모서리 좌표
// sx2, sy2 : 소스 이미지 내의 오른쪽 하단 모서리 좌표
// img의 (sx1, sy1)에서 (sx2, sy2)로 구성된 사각형 부분을 그래픽 대상 영역의 (dx1, dy1)에서 
// (dx2, dy2)의 사각형 영역에 크기를 조절하여 그린다.

 

* 이미지를 그리기 전에 이미지를 로딩하여 Image 객체를 만들어야 한다.

ImageIcon icon = new IamgeIcon("images/image0.jpg"); // 파일로부터 이미지 로딩
Image img = icon.getImage(); // 순수 이미지 객체 추출

* img는 이미지의 픽셀 값과 이미지 크기 등의 정보를 가지고 있다.

drawImage() 메소드를 이용하여 이미지를 그리기 위해서는 Img가 필요하다.

// 이미지 img의 폭과 높이를 알아내는 방법
int width = img.getWidth(this);
int height = img.getHeight(this);

* 이미지 img를 그래픽 대상 영역인 MyPanel의 (20, 20) 위치에 원본 크기로 그리는 코드

class MyPanel extends JPanel{
	public void paintComponent(Graphics g){
    	super.paintComponent(g);
        g.drawImage(img, 20, 20, this);
    }
}

drawImage()의 마지막 인자를 이용하여 이미지 그리기가 완료될 때 통보받는 객체를 지정할 수 있다.

통보 자체를 완전히 무시하고자 한다면 null을 주어도 된다. 대개의 경우 this나 null을 사용한다.

 

* 원본 이미지 img를 (20, 20) 위치에 100x100 크기로 조절하여 그리는 코드

class MyPanel extends JPanel{
	public void paintComponent(Graphics g){
    	super.paintComponent(g);
        g.drawImage(img, 20, 20, 100, 100, this);
    }
}

 

* img를 패널(MyPanel)에 꽉 차도록 크기를 조절하여 그리는 코드

class MyPanel extends JPanel{
	public void paintComponent(Graphics g){
    	super.paintComponent(g);
        g.drawImage(img, 20, 20, this.getWidth(), this.getHeight, this);
    }
}

 

* 원본 img의 (50, 0)에서 (150, 150)의 사각형 부분을 MyPanel의 (20,20)에서 (250,100) 영역에 그리는 코드

class MyPanel extends JPanel{
	public void paintComponent(Graphics g){
    	super.paintComponent(g);
        g.drawImage(img, 20, 20, 250, 100, 50, 0, 150, 150, this);
    }
}
반응형