2004년 12월 23일 목요일

자바에서의 AlphaComposite


AlpahComposite은 이미지 합성을 쉽게 해주는 고마운 놈이다.
포터와 더프가 만든 이미지를 그릴 때 누구를 위에 그려줄지 아니면 지울지를 정하는 규칙은 좋은 것 같다.
퍼터-더프와 관련된 자바 튜토리얼

그러나, 세상은 쉬운게 아닌가보다.
JPanel을 상속받은 놈의 paint(Graphics g)에서 바로 적용하게 되면 다음과 같이 이상하게 출력된다.

public void paint(Graphics g) {
g2d.setColor(Color.RED);
g2d.fillRect(100, 100, 200, 200);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR));
g2d.setPaint(Color.green);
g2d.fillRect(150, 150, 200, 200);
}

이상하게 출력되었다.


반면에 BufferedImage를 사용하면 정상적으로 출력이 된다.

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

BufferedImage buff = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);
Graphics2D gbi = buff.createGraphics();

gbi.setColor(Color.RED);
gbi.fillRect(100, 100, 200, 200);
gbi.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR));
gbi.setPaint(Color.green);
gbi.fillRect(150, 150, 200, 200);

g2d.drawImage(buff, null, 0,0);
}


정상 출력..ㅡㅡ



Win32SurfaceData와 Win32OffScreenSurfaceData와 관련이 있는지도 모르겠다.

댓글 3개:

  1. 디폴트 배경색이 이상한건가.

    배경색 정해주고 하면 잘 나오지 않을까.

    답글삭제
  2. setBackgroundColor()로 설정해도 마찬가지..



    자바에서 래스터라이징 끝나고 디바이스에 그려주기 바로 전에 픽셀 연산이 이루어지는데 오프스크린에서는 작동하고 디바이스에 바로 그려주는 경우에는 안되더군. Native 쪽에 구현이 안된 곳도 존재하고.

    답글삭제
  3. 그럼 새로 하나 만들어 -_-;;;

    답글삭제