프로그래밍 언어/JAVA

이미지 그리기

· 코딩마이데이

이미지 그리는 2가지 방법

GUI 응용프로그램 작성에 있어 이미지 그리기는 매우 중요합니다. 스윙에서 이미지는 다음 2가지 방법으로 그립니다.

  • JLbel 컴포넌트를 이용하여 이미지 그리기
  • Grpahics의 메소드를 이용하여 이미지 그리기

1. JLabel을 이용하여 이미지를 출력합니다.

ImageIcon image = new ImageIcon("images/apple.jpg"); // 이미지 파일 읽기
JLabel label = new JLabel(image); // 읽은 이미지를 출력할 레이블 컴포넌트 만들기
panel.add(label); // 레이블 컴포넌트를 패널에 부착하여 출력

 

이 방법은 코딩이 쉬운 장점이 있지만 이미지가 원본 크기로만 그려자는 단점이 있습니다.

 

2. Graphics의 drawImage() 메서드를 호출하여 원하는 위치에, 원하는 크기로, 원하는 비율로 이미지를 출력하는 방법입니다.

이 방법은 이미지의 원본 크기와 다르게 그릴 수 있는 장점이 있으나, 이미지를 그리는 코드를 직접 작성해야 하는 부담이 있습니다.

 

Graphics로 이미지 그리기

이미지를 그리는 Graphics 메서드는 총 6개이며 다음과 같이 3가지 유형이 있습니다.

 

원본 크기로 그리기

원본 크기로 이미지를 그리는 2개의 drawImage()는 다음과 같습니다.

 

크기 조절하여 그리기

본 이미지를 원하는 크기로 조절하여 그리는 2개의 drawImage()는 다음과 같습니다.

 

원본의 일부분을 크기 조절하여 그리기

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)
    
// dx1, dy1: 그래픽 영역 상의 상단 모서리 좌표
// dx2, dy2: 그래픽 영역 상의 오른쪽 모서리 좌표
// sx1, sy1: 소스 이미지(img) 내의 왼쪽 상단 모서리 좌표
// sx2, sy2: 소스 이미지(img) 내의 오른쪽 하단 모서리 좌표

// img의 (sx1, sy1)에서 (sx2, sy2)로 구성된 사각형 부분을 그래픽 영역 내의
// (dx1, dy1)에서 (dx2, dy2)의 사각형 크기로 변형하여 그립니다.

 

이미지 로딩: Image 객체 생성

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

ImageIcon icon = new ImageIcon(“image/image0.jpg”);
Image img = icon.getImage()

 

(20, 20) 위치에 이미지 원본 크기로 그리기

다음은 img를 MyPanel의 (20, 20) 위치에 원본 키기로 그리는 코드입니다.

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

 

drawImage()의 마지막 인자에는 그리고 완료를 통보 받는 객체를 지정하는데, 이 코드에서 this를 주어 MyPanel(혹은 슈퍼클래인 JPanel)이 통보를 처리하도록 하였습니다. 통보 자체를 무시하고자 한다면 null을 주면 됩니다/.

 

이미지를 (20, 20) 위치에 100x100 크기로 그리기

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


이미지를 패널의 크기에 꽉 차도록 그리기

img를 패널(MyPanel)에 꽉 차도록 조절하여 그리는 코드는 다음과 같습니다.

public void paintComponent(Graphics g) {
	super.paintComponent(g);
	g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
 }

 

원본 이미지의 일부분을 크기 조절하여 그리기

public void paintComponent(Graphics g) {
	super.paintComponent(g);
	g.drawImage(img, 20, 20, 250, 100, 50, 100, 50, 0, 150, 150, this);
 }

 

이미지 그리기

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

public class GrphicsDrawImageEx1 extends JFrame {
    private MyPanel panel = new MyPanel();
    GrphicsDrawImageEx1() {
        setTitle("원본 크기로 원하는 위치에 이미지 그리기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(panel);

        setSize(300, 420);
        setVisible(true);
    }

    class MyPanel extends JPanel {
        private ImageIcon icon = new ImageIcon("images/image0.jpg");
        private Image img = icon.getImage(); // 이미지 객체

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            // 이미지를 패널의(20,20)에 원래의 크기로 그린다.
            g.drawImage(img, 20, 20, this);
        }
    }

    public static void main(String[] args) {
        new GrphicsDrawImageEx1();
    }
}

 

[실행 결과]

 

 

JPanel로 만든 패널에 차도록 이미지 그리기

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

public class GraphicsDrawImageEx2 extends JFrame {
    private MyPanel panel = new MyPanel();

    public GraphicsDrawImageEx2() {
        setTitle("패널의 크기에 맞추어 이미지 그리기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(panel);

        setSize(200, 300);
        setVisible(true);
    }

    class MyPanel extends JPanel {
        private ImageIcon icon = new ImageIcon("images/image0.jpg"); // 이미지 로딩
        private Image img = icon.getImage(); // 이미지 객체

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            // 이미지를 패널 크기로 조절하여 그린다
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }
    }

    public static void main(String [] args) {
        new GraphicsDrawImageEx2();
    }
}

 

[실행결과]

 

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

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

public class GraphicsDrawImageEx3 extends JFrame {
	private MyPanel panel = new MyPanel();
	
	public GraphicsDrawImageEx3() {
		setTitle("이미지 일부분을 크기 조절하여 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(panel);
		
		setSize(300, 300);
		setVisible(true);
	}

	class MyPanel extends JPanel {
		private ImageIcon icon = new ImageIcon("images/image0.jpg");
		private Image img = icon.getImage();
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			// 이미지의 (100,50)에서 (200,200)의 영역을 패널상의 (20,20)에서 (250,100) 의 영역으로 확장하여 그린다.
			g.drawImage(img, 20, 20, 250, 100, 100, 50, 200, 200, this);
		}
	}
	
	public static void main(String [] args) {
		new GraphicsDrawImageEx3();
	}
}

 

[실행결과]

 

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

스윙의 페인팅 메커니즘  (2) 2025.08.02
클리핑(Clipping)  (3) 2025.07.30
도형 그리기와 칠하기  (1) 2025.07.24
Graphics  (2) 2025.07.21
스윙 컴포넌트 그리기  (4) 2025.07.18