Java로 뽀샤시 Go! Go!

개요

의외로 많은 개발자들이 자바의 이미지 처리능력에 대해서는 그다지 깊게 생각하지 않는 경향이 있다. 자바가 수요지향 도구로서만 활용되는 탓도 있지만, 느리다는 편견 때문이다. 실제로 자바는 알파 블랜딩을 적용할때 OpenGL가속을 기본으로 지원하지 않는다. Java를 실행할 때 옵션을 주어 OpenGL을 사용하게 할 수 있지만 모든 플랫폼과 드라이버에서 정상 작동하는지 여부는 보장되지 않으며, 이는 자바 7.0의 과제로 남겨져 있는 상태이다.

여하튼 오늘 우리가 해 볼 것은 유키의 사진을 포토샵으로 뽀샤시하게 하는 효과를, 자바로 구현 해 보는 것이다.

Yuki

나의 영웅 유키님♥

원래는 김정일 국방위원장의 사진과, 이명박 대통령의 사진을 이용하려 했었지만, 정치적 위협을 느껴 그만 뒀다.

무엇을 해야 하는가

뽀샵질에 능숙한 사람이라면 포토샵으로 어떤 작업을 차례로 수행해야 하는지 알고 있을 것이다.

  1. 원본이미지를 그대로 복사하여, 새 레이어에 붙여 넣는다.
  2. 새 레이어에 Blur 효과를 주어 흐릿하게 만든다.
  3. 새 레이어의 블랜딩 속성을 Screen 으로 만든다.

이 과정을 자바로 구현해야 한다.

요구 사항

  • 뽀샤시 효과
    • Blur 효과
    • Screen 블랜딩

용어 설명

  • 블랜딩: 블랜딩이란 한 특정 색상을 다른 특정 색상과 겹칠때 사용하는 규칙을 말한다. 예를 들어 Multiply 는 두 점중 어두운 점을 선택한다.
  • Composite: Composite란 블랜딩 규칙이 정의된 객체를 의미한다.
  • Blur 효과: Blur효과는 이미지를 흐릿하게 만들어주는 효과를 말한다.
  • Gaussian Blur: 가우시안 블러는 한점을 기준으로 특정 크기의 원을 정하고, 그 원의 크기만큼 점이 번지게끔 하여 Blur효과를 내는 방법이다.
  • 포토샵을 잘 다루는 사람이라면 사족인 설명이 되겠다.

기술 위협 분석

  • Blur 효과는 Java의 ConvolveOp 을 통해 쉽게 구현이 가능하다. (안전/쉬움)
  • Screen 블랜딩 기법이 정의된 Composite는 Java가 아직까지 제공하지 않고 있어, Composite를 직접 구현해야 한다.

Blur

ConvolveOp 은 Convolve 연산을 의미한다. 이는 이미지 단위에 수행되는 연산으로, 주어진 매트릭스를 이용하여 원본 이미지를 변환하는 역할을 한다.

  • 예제 매트릭스:matrix

이 3×3 매트릭스는 다음을 의미한다. 원본이미지에서 새로운 이미지를 만들어 낼 때, 주변 8개의 점들이 각자 새로 운 점에 1/9의 영향을 미친다는 것을 의미한다. 그리고 원래의 점 또한 1/9의 영향을 미치게 된다. 따라서 새로운 점은 주변 9개점의 평균 색상으로 그려지게 됨을 알 수 있다. 참고로 이 매트릭스의 총 합은 1이 되어야 한다. 1보다 크면 사본이미지는 원본 보다 밝아지게 되고 1보다 작으면 어두워지게 된다.

이 매트릭스는 새로운 점이 그려질때 주변의 영향을 받게 된다는 것을 나타내지만, 반대로 생각하면 현재 점이 주변 점들에게 1/9씩 영향력을 행사한다는 의미도 된다. 따라서, 이 연산을 지속적으로 반복하여 적용하며 애니메이팅 하면, 윈도우즈 미디어 플레이어등의 비주얼라이제이션의 애니메이션이 점점 흐릿해져가다 사라진다던가 하는 것이 어떻게 구현되어있는가 생각해 볼수 있는 기회가될 것이다.

Composite

블랜딩을 사용하기 위해서는 Blending 규칙이 정의된 Composite를 자바 그래픽스에 적용시켜 주면 된다. 이후 이 그래픽스를 이용하여 그려지는 모든 그림은 블랜딩 규칙을 따르게 된다. 따라서, 뽀샤시 효과를 위한 거시구현은 다음과 같다.

거시 구현

// 출력 이미지로 부터 그래픽스를 얻는다.

Graphics2D g = ….

// 블러 효과가 적용된 이미지를 얻는다. 이는 우리가 구현해야 한다.

BufferedImage bluredImage = getBluredImage(originalImage);

// 원본이미지를 먼저 그린다.

g.drawImage(originalImage, 0, 0, null);

// 그래픽스에 Screen 블랜딩 규칙을 적용시키고,블러 효과가 적용된 이미지를 덧 씌운다.

// 고맙게도 Screen 블랜딩 규칙은 Romain Guy가 제공한다.

g.setComposite(BlendComposite.Screen);

g.drawImage(bluredImage, 0, 0, null);

세부 구현

실제, 이 문서가 제공하는 예제는 Gaussian Blur를 직접 구현하였다, 소스 파일을 참조 할 것.

결과

뽀샤시 윸희

Tags: , ,

Leave a Reply