자바의 Graphics - 3

20887 단어 JavaJava

이미지 그리기

JPanel에 Graphics 메소드를 사용

장점

• 이미지의 원본 크기와 다르게 그리기 가능
• 이미지의 일부분 등을 그리는 것이 가능

단점

• 컴포넌트로 관리되지 않는다.
-> 이미지에 이벤트가 발생하지 않는다.
-> 구현자가 이미지의 위치와 크기를 설정하여야 한다.

메소드

※ ImageObserver
이미지가 그려지면, 통보를 받는 객체를 지정하는 매개변수
주로 this를 사용하거나 null로 통보를 받지 않을 수 있다.

이미지 원본 크기로 그리기

void drawImage(Image img, int x, int y, Color backgroundColor, ImageObserver ob)

void drawImage(Image img, int x, int y, ImageObserver ob)

이미지의 크기를 조절하여 그리기

void drawImage(Image img, int x, int y, int width, int height, 
	Color backgroundColor, ImageObserver, ob)

void drawImage(Image img, int x, int y, int width, int height, ImageObserver ob)

이미지 일부분의 크기를 조절하여 그리기

void drawImage(Image img, int dx1, int dy1, int dx2, int dy2, 
	int sx1, int sy1, int sx2, int sy2, Color backgroundColor, ImageObserver)
    
void drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
	int sx2, int sy2, ImageObserver ob)

이미지 그리기 메소드 예제

// Image 객체 생성
ImageIcon imgIcon = new ImageIcon("image/image.jpg");
Image img = imgIcon.getImage();

// 원본 이미지를 (30, 30) 위치에 원본 크기로 그리기
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 30, 30, this); // ImageObserver에 this를 주었음
    // 고정 크기이다.
}

// 크기를 조절하여 그리기
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 30, 30, 50, 50);
    // (30, 30) 위치에 이미지를 50 x 50 크기로 그리기(고정 크기)
}

// 이미지를 패널 크기에 맞춰 꽉 차도록 그리기
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
    // 패널에 꽉 채워야하므로 (0, 0) 위치에 그리기
    // JPanel의 크기가 변하면 이미지의 크기도 변한다.(가변적)
}

// 이미지의 (0, 0)부터 (100, 100) 부분을 JPanel의 (50, 50)부터 (200, 200) 위치에 그리기
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 50, 50, 200, 200, 0, 0, 100, 100, this);
}



클리핑(Clipping)

클리핑 영역 : 하나의 사각형 영역
• 클리핑 영역에서만 그래픽이 이루어지도록 하는 기능
• 그리기, 칠하기 이미지 그리기, 문자열 출력 등에서 작동한다.

클리핑 메소드

void setClip(int x, int y, int width, int height)
// 컴포넌트의 (x, y) 위치에서 width x height 크기의 사각형을 클리핑 영역으로 지정

void clipRect(int x, int y, int width, int height)
// 기존 클리핑 영역과 새로 지정된 영역의 교집합 영역을 클리핑 영역으로 지정
// 사용할수록 클리핑 영역이 줄어든다.

예제

import java.awt.*;
import javax.swing.*;

public class ClippingExample extends JFrame {
    private ExPanel p = new ExPanel();
    
    public ClippingExample() {
        super("클리핑 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(p);
        setSize(200, 300);
        setVisible(true);
    }
    
    class ExPanel extends JPanel {
    	// 이미지 객체 생성
        private ImageIcon imgIcon = new ImageIcon("이미지경로");
        private Image img = imgIcon.getImage();
        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            // JPanel의 (80, 50) 위치에 150x150 크기로 클리핑 영역 설정
            g.setClip(80, 50, 150, 150);
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
            g.setColor(Color.GREEN);
            g.setFont(new Font("Times", Font.BOLD, 50));
            // (10, 130) 위치에 문자열 그리기
            g.drawString("Clipping Example!", 10, 130);
        }
    }
    
    public void main(String[] args) {
        new ClippingExample();
    }
}

실행 결과

좋은 웹페이지 즐겨찾기