주요글: 도커 시작하기
반응형
Java 1.4는 비윈도우 환경에서도 이미지를 생성할 수 있다.

자바1.4-Headless 기능 지원

이미지 처리와 관련해서 1.4 이전버전까지 자바의 문제점 중의 하나는 비윈도우(non-window) 환경에서 AWT나 Swing과 같은 GUI 컴포넌트를 사용할 수 없다는 점이었다. 예를 들어, 다음 클래스를 살펴보자.

    import java.awt.*;
    
    public class TestGUI {
        public static void main(String[] args) {
            Toolkit toolkit = Toolkit.getDefaultToolkit();        }
    }
    

TestGUI 클래스를 비윈도우 환경의 리눅스나 유닉스 명령행에서 실행하면 다음과 비슷한 예외가 발생한다.

    [madvirus@wolf temp]$ java TestGUI
    Exception in thread "main" java.lang.InternalError: 
    Can't connect to X11 window server using
    ':0.0' as the value of the DISPLAY variable.
        at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:126)
        ....
        at TestGUI.main(TestGUI.java:5)

자바 1.3 버전까지는 비윈도우 환경에서 Toolkit과 같은 AWT/Swing 관련 클래스를 사용할 수 없었기 때문에, 웹 어플리케이션에서 동적으로 이미지를 생성해야 하는 경우 BufferedImage를 곧바로 사용하지 못하고 별도의 이미지 처리 라이브러리를 구매하거나 작성해야만 했다.

시간이 지날수록 웹 어플리케이션에서 동적으로 이미지를 생성해야 하는 요구사항이 증가하기 시작했으며, 따라서 비윈도우 환경에서 GUI 클래스를 마음대로 사용하지 못하는 자바의 문제점은 개발자들을 귀찮게 하는 요인중의 하나가 되었다. 이를 처리해줄 수 있는 별도의 라이브러리를 작성하거나 구매해서 사용해야 했다.

그래서, 이러한 개발자들의 불만을 해소시키기 위해 자바 1.4 버전에는 비윈도우 환경에서도 GUI 클래스를 사용할 수 있는 기능이 추가되었다. 이 기능은 매우 간단해서 명령행에서 다음과 같이 시스템 프로퍼티를 지정해주면 된다.

    java -Djava.awt.headless=true com.some.RunningClass
    

"java.awt.headless"는 자바 1.4에 새롭게 추가된 시스템 프로퍼티로서 비윈도우 환경에서 실행되는지의 여부를 설정할 때 사용된다. 이 프로퍼티의 값을 "true"로 지정하면 비윈도우 환경에서도 GUI 관련 클래스를 사용할 수 있게 된다. 따라서, 앞에서 작성한 TestGUI 클래스를 다음과 같이 실행하면 예외가 발생하지 않게 된다.

    java -Djava.awt.headless=true TestGUI

java.awt.headless 시스템 프로퍼티의 기본값은 "false"이다.

동적으로 이미지 생성하기

java.awt.headless 시스템 프로퍼티의 값을 "true"로 지정하면 다음과 같이 java.awt.image.BufferedImage와 java.awt.Grahpics 클래스 그리고 자바 1.4에 새롭게 추가된 javax.imageio.ImageIO 클래스를 사용하여 동적으로 GIF/JPEG 이미지를 생성할 수 있다. 동적으로 이미지를 생성하는 순서는 다음과 같다.

  1. BufferedImage 클래스를 사용하여 원하는 크기의 버퍼 이미지를 생성한다.
  2. 생성된 버퍼 이미지와 관련된 Graphics 객체를 구한다.
  3. Graphics 객체를 사용하여 원하는 이미지를 그린다.
  4. ImageIO 클래스를 사용하여 버퍼 이미지를 GIF 내지 JPEG 이미지 파일로 변환한다.
실제 코드로 보면 다음과 같다.

    
    int width = 200; // 이미지 세로 크기
    int height = 150; // 이미지 가로 크기
    
    BufferedImage image = new BufferedImage(width, height,
        BufferedImage.TYPE_3BYTE_BGR);    
    Graphics g = tempBuffer.getGraphics();    // 또는 
    // Graphics2D g = tempBuffer.createGraphics();
    
    ... // Graphics 객체를 사용하여 원하는 이미지를 그린다.
    
    // 파일을 생성한다.
    File outFile = new File("c:\temp.jpg");
    ImageIO.write(image, "jpg", outFile);    

위와 같이 하면 Grahpics 객체를 통해서 그린 이미지를 c: emp.jpg 파일로 저장할 수 있다. 만약 JPEG이 아닌 GIF 포맷으로 저장하고 싶다면, ImageIO.write() 메소드의 두번째 파라미터에 "jpg" 대신 "gif"를 전달하면 된다.

ImageIO.write() 메소드에는 File 객체 대신 OutputStream을 파라미터로 전달받는 것도 존재한다. 즉, 다음과 같이 출력할 수도 있다.

    FileOutputStream outStream = new FileOutputStream("c:\temp.jpg");
    ImageIo.write(image, "jpg", outStream);
    outStream.close();

위에서 OutputStream을 사용할 수 있다는 것은 서블릿에서 이미지를 동적으로 생성하여 웹브라우저에 출력할 수 있다는 것을 의미한다. 서블릿에서 동적으로 이미지를 생성하고자 하는 경우 다음과 같이 코드를 작성하면 된다.

    public class ImageCreator extends HttpServlet {
        public void doGet(HttpServletRequest request,
                          HttpServletResponse response)
            throws IOException, ServletException {
            
            response.setContentType("image/jpeg");
            ServletOutputStream outStream = response.getOutputStream();            
            BufferedImage image = BufferedImage(width, height,
                BufferedImage.TYPE_3BYTE_BGR);
            Graphics g = image.getGraphics();
            
            // Graphics 객체를 사용하여 원하는 이미지를 생성한다.
            ...
            
            ImageIO.write(image, "jpg", outStream);            
            outStream.close();
        }
    }

위와 같이 서블릿 클래스를 사용했다면 다음과 같이 서블릿을 호출하여 웹브라우저에서 이미지를 볼 수 있다.

    <img src="http://some.com/../servlet/ImageCreator" width="100" height="100">

결론

자바 1.3 버전까지만 해도 비윈도우 환경에서 Image 객체를 출력 스트림으로 보내기 위해서는 비표준 클래스인 com.sun.image.codec.jpeg.JPEGImageEncoder를 사용하거나 별도의 라이브러리가 필요했으나, 이제 자바 1.4의 java.awt.headless 시스템 프로퍼티와 javax.imageio.ImageIO 클래스를 사용함으로써 비윈도우 환경에서도 얼마든지 GIF와 JPEG 이미지를 생성할 수 있게 되었다.

이제 자바 1.4도 출시된 지 1년정도 되었고, 지금은 안정화된 1.4.1 버전이 출시된 상태이다. 따라서 새롭게 추진되는 프로젝트에서 비윈도우 환경에서 이미지를 동적으로 생성해야 하는 경우 별도의 라이브러리가 없어도 그리고 비표준 API를 사용하지 않고도 이미지를 생성할 수 있을 것이다.

관련링크:

+ Recent posts