2009-12-28 2 views
1

Java의 BufferedImage에서 투명한 PNG 이미지를 만들려고합니다.알파 채널이없는 PNG 투명도

PNG가 알파 채널을 지원하지 않는 소프트웨어의 다른 부분으로로드됩니다.

Chapter 8, section 5, part 4 of the PNG book에 따르면 픽셀 값을 투명하게 지정하여 투명도를 얻을 수 있기 때문에 문제가되지 않습니다. 이 작업은 png 파일에 tRNS 헤더를 만들어 작동합니다.

이 기술 세부 사항을 Java 코드로 변환하는 방법을 잘 모르겠습니다. 실제 이미지 자체는 흑백입니다. 각 픽셀은 검은 색이나 흰색이 될 것입니다. 알파 채널을 사용하지 않고 각 흰색 픽셀을 투명 픽셀로 대체하고 싶습니다. 누군가 날 바른 방향으로 밀어 주시겠습니까?

답변

2

는 다음과 같은 코드를 사용할 수 있습니다.

흑백 투명 BufferedImage의 작성 : PNG 파일에

public static BufferedImage createTransparentMonochromeBufferedImage(int w, int h) 
{ 
    // The color map contains the colors black and white 
    byte[] cMap = {0, 0, 0, (byte)255, (byte)255, (byte)255}; 
    // Create an IndexColorModel setting white as the transparent color 
    IndexColorModel monochrome = new IndexColorModel(8, 2, cMap, 0, false, 1); 
    // Return a new BufferedImage using that color model 
    return new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED, monochrome); 
} 

저장되는 BufferedImage :

public static void saveBufferedImageAsPNG(BufferedImage img, String filename) 
                  throws IOException{ 
    File file = new File(filename); 
    ImageIO.write(img, "png", file); 
} 
+0

완벽. Java API 문서가이 클래스에 다소 부족한 것으로 나타났습니다. 어쩌면 나는 단지 멍청한 행동 일 뿐이다. –

-1

잘 모르겠지만 대답은 The png Specification입니다. 희망이 도움이!

당신을 위해 열심히 할 png 파일 (아마 libpng를위한 자바 바인딩?)을 작성하기위한 자바 용 라이브러리가 없습니까? (그리고 일이 잘 안되면 많은 두통을 피할 수 있습니다.)

+0

나는 당신의 대답을 주셔서 감사합니다,하지만이가 PNG 이미지에서 처리하는 방법을 이미 알고를 . Java 코드로 변환하는 방법을 모르겠습니다. 나는 그것이 BufferedImage의 ColorModel과 관련이 있다고 생각하지만, 한가지 확실하지는 않습니다. 오해가 생겨서 죄송합니다. –

0

나는 IndexColorModel : http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/IndexColorModel.html을 사용하려고합니다.

+0

이것은 제가 생각한 것을 확인시켜줍니다. 나는 지금 2 일 동안 그 링크를 읽고 다시 읽었다. –

+0

그렇다면 이미 IndexColorModel을 사용하고 있고 특별히 생성자 인수에 대해 알고 있다면 어떻게해야할까요? 'trans'arg로 전달 된 적절한 인덱스로 CM을 생성해야합니다. – prodigitalson

+0

나는 IndexColorModel을 사용할 확신이 없으며, 지금도 Im을 사용하는 방법을 확신 할 수 없다. 그러나이 링크는 유망 해 보입니다. http://mindprod.com/jgloss/indexcolormodel.html. 귀하의 확인을 보내 주셔서 감사 드리며 답변으로 받아 들일 것입니다. –

0

는 다음과 같은 시도 :

  1. BufferedImage에서 첫 번째 흰색 픽셀의 인덱스를 알아보십시오.
  2. 원하는 매개 변수를 사용하여 IndexColorModel을 만듭니다.
  3. ColorConvertOp을 만듭니다. nullRenderingHints 인수로 전달할 수 있습니다.
  4. [ColorConvertOp.createCompatibleDestImage] [3]을 사용하여 새 BufferedImage 인스턴스 (대상)를 수신합니다.
  5. [ColorConvertOp.filter] [4]를 사용하여 원본에서 대상으로의 변환을 수행합니다.

저는 이것에 대해 완전히 확신하지는 않지만, ColorConvertOp은 좋은 출발점처럼 보입니다. 그것이 어떻게 작동하는지 우리에게 말해주세요!

[3] : http://java.sun.com/javase/6/docs/api/java/awt/image/ColorConvertOp.html#createCompatibleDestImage(java.awt.image.BufferedImage, java.awt.image.ColorModel에) [4] : http://java.sun.com/javase/6/docs/api/java/awt/image/ColorConvertOp.html#filter(java.awt.image.BufferedImage, java.awt.image.BufferedImage)