2010-03-03 4 views
5

BufferedImage에서 색상을 대체하는보다 효율적인 방법이 있는지 궁금합니다. 지금은 다음과 같은 방법을 사용합니다 :Java에서 BufferedImage의 색상을 대체하는 방법

대체 할 색상과 투명도를 포함한 색상으로 배열을 채 웁니다. 그런 다음 이미지의 모든 픽셀을 반복합니다. 배열의 색상 중 하나와 일치하는 경우 배열의 새 색상으로 바꿉니다. 코드는 다음과 같습니다.

Graphics2D g2; 
    g2 = img.createGraphics(); 
    int x, y, i,clr,red,green,blue; 

    for (x = 0; x < img.getWidth(); x++) { 
    for (y = 0; y < img.getHeight(); y++) { 

     // For each pixel in the image 
     // get the red, green and blue value 
     clr = img.getRGB(x, y); 
     red = (clr & 0x00ff0000) >> 16; 
     green = (clr & 0x0000ff00) >> 8; 
     blue = clr & 0x000000ff; 

     for (i = 1; i <= Arraycounter; i++) { 
     // for each entry in the array 
     // if the red, green and blue values of the pixels match the values in the array 
     // replace the pixels color with the new color from the array 
     if (red == Red[i] && green == Green[i] && blue == Blue[i]) 
     { 
      g2.setComposite(Transparency[i]); 
      g2.setColor(NewColor[i]); 
      g2.fillRect(x, y, 1, 1); 
     } 
     } 
    } 

내가 사용하고있는 이미지는 작지만 20x20 픽셀입니다. 그럼에도 불구하고이를 수행하는보다 효율적인 방법이 있어야합니다.

+0

아마도 원래 문제를 설명하면 도움이 될 것입니다. – medopal

+0

이 코드는 맵에서 범례로 사용할 이미지를 만듭니다. 4 가지 색상의 템플릿 이미지 세트가 있습니다. 검정, 빨강, 녹색 및 파랑. 맵의 주제 표현에 따라 템플리트 이미지가 올바른 색상을 가져야합니다. 검은 색은 배경색으로, 빨간색은 올바른 테두리 색으로, 녹색은 해시 패턴으로, 파란색 영역은 투명 해집니다. – Rene

답변

10

이미지 픽셀 값을 변경하는 대신 기본 ColorModel을 수정할 수 있습니다. 그렇게 빨리 그리고 전체 이미지를 반복 할 필요가 없어 잘 확장됩니다.

+1

'ColorMap'은 Java API의 클래스가 아닙니다. 어떻게 그럴 수 있니? – uckelman

+2

그게 전부 였어 (이미 고쳤다). 투표가 심한 것 같아. – objects

+0

이 기술은 잘 작동하고, 이미지의 대비가 실시간으로 조정되어야하는 의료 이미지 뷰어에 사용되었습니다. 개별 픽셀 값을 변경하는 것은 너무 느립니다. – objects

3

HashMap<Color,Color>을 사용하십시오. 키는 원래 색상이어야하며 값은 대체 색상이어야합니다. get가 null을 돌려주는 경우는, 아무것도 실시하지 않습니다.

3

이 작업을 수행하는 관용적 인 방법은 LookupOp을 구현 한 다음이 작업을 적용하여 BufferedImage이라는 새 대상을 만드는 것입니다. 좋은 대답은 here입니다.

+0

내가해야 할 일은 빨강, 녹색, 파랑 및 검정 픽셀을 모두 새로운 색상으로 변환하는 것입니다. LookupOp을 사용하여이 작업을 수행 할 수 있습니까? 각 색상 구성 요소마다 개별적으로 작동하는 것 같습니다. – Rene

+0

나는 그것을 사용하지 않았지만 나는 확신 할 수 없다고 확신한다. 내가 참조하는 답변을 살펴보면 LookupTable (2D 배열로 생성 됨)이 소스를 대상 색상에 매핑하는 데 사용 된 것처럼 보입니다. LookupTable의 lookupPixel 메소드를 확인하십시오 ... 저는 이것이 일반적으로 RGB 요소 값을 포함하는 4 요소 src 배열로 호출 될 것이라고 확신합니다 (이 경우에도 확인해야합니다). – Adamski

관련 문제