2013-03-04 4 views
0

내가 작업중인 게임의 캐릭터 스프라이트에 대한 팔레트 교환을해야하므로 둘 이상의 플레이어가 동일한 캐릭터를 선택하면 서로 다른 색상으로 표시됩니다. BufferedImages에 모든 스프라이트를 저장하고 팔레트를 동적으로 변경하려고합니다.팔레트 Java에서 BufferedImage 바꾸기

예를 들어 빨간색을 파란색으로, 검은 색을 주황색으로, 노란색을 모두 분홍색으로 변경하는 픽셀을 변경하고 싶습니다. 나는 약 25 색을 교환해야 할 것이다.

나는 이미 연구를 해왔고 ColorModel의 일종을 만들고 그 모델에서 새로운 BufferedImage를 만들어야 할 것처럼 보였다. 나는 ColorModel을 만드는 방법을 모르기 때문에 튜토리얼이 있다면 큰 도움이 될 것입니다.

감사합니다.

+0

안티 앨리어싱을 사용하고 있습니까? 아니면 정확한 색상만을 사용하는 이미지입니까? – kritzikratzi

+0

정확한 색상 : 그들은 Megaman X – jedyobidan

+0

아에서 16 비트 스프라이트를 얻었습니다. 그러면 직접 바꿀 수 있습니다. 잠시 후 예를 게시 할 것입니다. – kritzikratzi

답변

1

속도가 중요하지 않은 경우 가장 바보 같은 해결책을 선택합니다. 간단히 색상을 수동으로 바꾸십시오.

BufferedImage.getRGB(...)으로 모든 픽셀 값을 얻을 수 있습니다. 그런 다음 색상이 목록에 있는지 확인하고 적절하게 교체하십시오. 나중에 setRGB를 사용하여 새 색상을 저장할 수 있습니다.

여기 예입니다 :

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 

import javax.imageio.ImageIO; 

public class Equ{ 
    public static void main(String[] args) throws IOException { 
     BufferedImage img = new BufferedImage(20, 20, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g = img.createGraphics(); 
     g.setColor(Color.white); 
     g.fillRect(0, 0, 20, 20); 
     g.setColor(Color.black); 
     g.fillRect(5, 5, 10, 10); 


     Color[] mapping = new Color[]{ 
      Color.black, Color.white, // replace black with white 
      Color.white, Color.green // and white with green 
     }; 

     ImageIO.write(img, "png", new File("original.png")); 
     swapColors(img, mapping);  
     ImageIO.write(img, "png", new File("swapped.png")); 
    } 


    public static void swapColors(BufferedImage img, Color ... mapping){ 
     int[] pixels = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); 
     HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 
     for(int i = 0; i < mapping.length/2; i++){ 
      map.put(mapping[2*i].getRGB(), mapping[2*i+1].getRGB()); 
     } 


     for(int i = 0; i < pixels.length; i++){ 
      if(map.containsKey(pixels[i])) 
       pixels[i] = map.get(pixels[i]); 
     } 

     img.setRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth()); 
    } 
} 
+1

지각에 대한 미안 해요, 어제 밤 마지막 질문에 물어 보았습니다. 그래서 나는 그것을 시험해 보았습니다. 위대한 작품, 정말 고마워! – jedyobidan

+0

도움이 되니 기쁩니다! – kritzikratzi

0

다음 코드는 원래의 래스터 데이터를 공유하는 새로운 BufferedImage를 구성하여 팔레트를 교환합니다. 그래서 그것은 빨리 달리고 많은 기억을 잡지 않습니다.

static BufferedImage switchPalette(BufferedImage bi, 
     IndexColorModel icm) { 
    WritableRaster wr = bi.getRaster(); 
    boolean bAlphaPremultiplied = bi.isAlphaPremultiplied(); 
    return new BufferedImage(icm, wr, bAlphaPremultiplied, new Hashtable()); 
}