2014-11-17 7 views
3

나는 두 개의 RenderedImages을 가지고 있습니다. 이 두 이미지를 사용하여 Overlay Operation을 만들고 싶습니다. 따라서 데이터 유형과 밴드 수를 일치시켜야합니다.
하나의 이미지에 3 개의 밴드 (RGB)가 있고 두 번째 이미지에 4 개의 밴드 (ARGB)가 있다는 문제가 있습니다.JAI RenderedImage에 알파 채널 추가

제 질문은 어떻게 할 수 있습니다 첫 번째 이미지에 알파 채널을 추가 할 수 있습니까? Overlay Operation?


확인 수정, I는 상기 제 영상에 알파 채널을 추가하는 방법을 발견했다. 아래는 코드입니다. 나는 단 하나의 줄무늬 상수 이미지를 만들고 그것을 첫 번째 이미지와 병합했다.

ParameterBlock pb = new ParameterBlock(); 
pb.add(new Float(finalImage.getWidth())).add(new Float(finalImage.getHeight())); 
pb.add(new Byte[] {new Byte((byte)0xFF)}); 
RenderedImage alpha = JAI.create("constant", pb); 

finalImage = BandMergeDescriptor.create(finalImage, alpha, null); 

내가 지금 가지고있는 문제는 오버레이를 추가 할 때마다 이미지의 색상이 변하는 것입니다. 모든 색상이 빨간색 또는 분홍색의 뉘앙스가됩니다. 두 번째 오버레이를 추가하면 이미지가 다시 일반화되지만 첫 번째 오버레이는 색상을 변경합니다. 모든 검은 영역은 흰색이됩니다.

또한 오버레이의 배경이 투명하지 않습니다. 그것은 회색입니다.

아래는 이미지의 예입니다, 그래서 당신이 색을 변경하는 방법을 참조하십시오

original Picture

after adding the first overlay

after adding the second overlay

당신이 볼 수 있듯이, 그림 및 오버레이 색상을 변경하고 오버레이의 배경이 투명하지 않습니다.

이미지가 항상 올바르게 표시되도록이 문제를 해결할 수 있습니까? 감사!

답변

0

ARGB 모델을 사용하여 새로운 BufferedImage를 생성하고 불투명 한 배경 그림을이 새로운 BufferedImage에 페인트하면됩니다. 그런 다음 알파 채널이있는 BufferedImage가 있습니다 (픽셀은 모두 불투명하지만). 따라서 컴포지션이 잘 작동해야합니다.

+0

그건 작동하지 않았다. 이미지의 색상이 계속 변합니다. – adryr

+0

또한 매개 변수 블록을 적용하지 않습니까? 변경되지 않은 첫 번째 이미지를 새로운 깨끗한 버퍼 이미지로 그립니 까? – cello

+0

네, 타입이 TYPE_4BYTE_ARGB' 인 새'BufferedImage'를 만들고 첫 번째 이미지를 그 안에 넣었습니다. 'img.createGraphics(). drawRenderedImage (finalImage, 새로운 AffineTransform());' – adryr

0

보통 TYPE_INT_ARGB의 BufferedImages를 사용하므로 잘 모르겠지만 새로운 ARGB BufferedImage에 RGB BufferedImage를 그리는 방법을 사용하여 문제없이 다른 것들에 그리는 방법을 자주 사용했습니다. 컬러 변경은 오버레이 프로세스의 다른 채널에 원하지 않는 변경이 발생하고 있음을 암시합니다. 특정 이미지와 관련이없는 것처럼 보이기 때문입니다. 오버레이 작업이 하나의 이미지를 다른 알파 이미지로 그리는 것과 비슷하다면 오버레이 자체에 Graphics.drawImage()/drawRenderedImage() 메서드를 사용하는 것이 좋습니다.이 경우 알파도 필요하지 않습니다.

코드 :

public RenderedImage overlay(RenderedImage back, RenderedImage front, AffineTransform overlayTransformation) 
{ 

    BufferedImage newBack = new BufferedImage(back.getWidth(), back.getHeight(), TYPE_3BYTE_RGB); 
    newBack.setData(back.getData()); 
    Graphics2D graphics = (Graphics2D)(newBack.getGraphics()); 
    graphics.drawRenderedImage(front, overlayTransformation); 
    return newBack; 

} 

당신은 래스터 그래도 수정되지 않은 원본을 다시 확인 할 수 있습니다.