2012-11-16 4 views
3

그레이 스케일 색상 인 Java에서 PNG 이미지 (알파 채널 포함)를 그린 다음 투명한 색상을 오버레이하는 방법을 찾고 있습니다 (예 : Green at) 75 % 불투명도, 위에 색상을 변경합니다. 명확하게 말하면, 결과 이미지는 그 위에 투명 색상을 배치 한 직접적인 결과이며 특별한 유형의 블렌딩의 결과가 아닐 것입니다.알파 채널이있는 PNG 상단에 투명 색상을 중첩하십시오.

: 화상의 위에 오버레이 후 RGB 색 (102, 255, 0, 알파)

: 그리고

예를 들어, I는 다음 이미지를 그리는 것

이미지 위에 색상을 그리는 방법은 화면의 다른 이미지를 가까이에서 간섭하지 않도록해야합니다. 이것은 Adobe Photoshop의 색상 오버레이 기능과 유사하게 작동합니다. 두 개의 이미지는 별도의 색상 오버레이를 가질 수 있지만 별도의 오버레이는 서로 충돌하지 않습니다.

leonbloy 덕분에 "SRC_OVER"를 사용하는 AlphaComposit에서이 문제를 해결할 수 있다고 생각합니다. 그 결과 오버레이가 화면의 다른 이미지 객체에 영향을 미치지 않도록 새로운 BufferedImage로 결과를 저장하는 방법을 사용할 수있었습니다.

테스트 결과를 게시 할 예정입니다.

+0

당신이하고 싶은 것이 무엇인지, 무엇을 시도했는지 확실하지 않습니다. BufferedImage를 사용하고 있습니까? 읽었습니까? - [this] (http://stackoverflow.com/questions/2318020/merging-two-images)? 최상위 이미지의 투명도에 따라 "일반"오버레이를 만들고 싶습니까, 아니면 특별한 블렌딩/오버레이를 구현하려고합니까? [AlphaComposite] (http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/AlphaComposite.html)를 보셨습니까? – leonbloy

+1

사과하겠습니다. 나는 더 명확히하려고 노력할 것입니다. 제 의도는 투명성 당 일반 오버레이를하는 것입니다. 나는 어떤 식 으로든 블렌딩에 관심이 없다. Java에서 2D 그래픽 프로그래밍을 처음 접했고 초기 검색에서 찾지 못했기 때문에 AlphaComposite 클래스를 알지 못했습니다. AlphaComposite의 [this] (http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html) 페이지를 살펴보면 "SOURCE_OVER"가 사용하려고하는 것처럼 보입니다. – ubertastic

+1

좋습니다, 문제를 해결하면 솔루션을 직접 답변으로 추가하고 수락 할 수 있습니다. BTW, 이것은 PNG와 관련이 없으므로 태그를 제거했습니다. – leonbloy

답변

5

저는 AlphaComposite, Graphics2D 및 BufferedImage를 사용하여 원하는 효과를 얻을 수있었습니다.

@Override 
public void paintComponent(Graphics g) { 
    BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D gbi = result.createGraphics(); 
    BufferedImage x = null; 
    try { 
     x = ImageIO.read(getClass().getResource("/resources/someimage.png")); 
    } catch (IOException ex) { 
     Logger.getLogger(CanvasPanel.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    gbi.drawImage(x, 0, 0, this); 
    gbi.setColor(selectedColor); 
    gbi.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.75f)); 
    gbi.fillRect(0, 0, width, height); 
    g.drawImage(result, 0, 0, this); 
} 
관련 문제