JavaFX | Canvas 그래픽 그리기 | 이미지 파일 사용하기

보다 복잡한 그래픽을 렌더링하려면 미리 렌더링 그래픽을 이미지 파일로 준비해서 이를 로드하고 렌더링하는 것이 좋다. 미리 Image 인스턴스를 준비해두고, 그것을 렌더링하면 된다.

이 경우의 “Image"는 AWT의 Image가 아니다. 이는 javafx.scene.image 패키지에 포함되어 있는 클래스이다. 그러므로 AWT/Swing의 경우와는 차이가 있다.

Image 인스턴스 생성하기

변수 = new Image(경로);

Image 인스턴스의 생성은 여러가지 방법이 있지만, 우선 이 생성하는 방법만 기억해두자. 인수에 가져올 이미지 파일의 경로를 String로 지정하면 이를 로드한 Image 인스턴스가 생성된다.

Image 그리기

이것도 GraphicsContext 클래스에 메소드가 준비되어 있다. 이것은 렌더링 방식에 따라 여러 가지가 있다. 주요 방법을 정리해 두자.

지정 위치에 이미지 그리기

"GraphicsContext".drawImage("Image", 가로 위치, 세로 위치);

지정 영역에 이미지를 변형하여 그리기

"GraphicsContext".drawImage("Image", 가로 위치, 세로 위치, 폭, 높이);

이미지의 일부를 Canvas의 특정 영역에 그리기

"GraphicsContext".drawImage("Image", 가로  위치1, 세로  위치1, 너비1, 높이1, 가로 위치2, 세로 위치2, 너비2, 높이2);

그러면 실제로 이미지 파일을 그려 보자. 예를 들어, “sample.jpg"라는 이미지 파일을 읽어 Canvas에 표시하는 예제는 아래와 같다.

package com.devkuma.javafx;
 
import java.net.URL;
import java.util.ResourceBundle;
 
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;

public class AppController implements Initializable {
    @FXML Canvas canvas;
    GraphicsContext gc;
     
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        gc = canvas.getGraphicsContext2D();
        draw();
    }
     
    void draw(){
        Image image = new Image("sample.jpg");
        gc.drawImage(image, 0, 0);
    }
}

여기에서는 ’new Image(“sample.jpg”);‘와 같이 해서 sample.jpg를 로드한다. Java 프로그램은 프로그램 파일이 배치되는 위치가 현재 디렉토리가 되므로 같은 위치에 sample.jpg을 준비해서 실행해야 한다.