0

私が取り組んでいるゲームのキャラクター スプライトのパレット スワップを行う必要があるため、複数のプレイヤーが同じキャラクターを選択すると、それらは異なる色になります。すべてのスプライトを BufferedImages に保存しましたが、パレットを動的に変更したいと考えています。

たとえば、赤のピクセルを青に、黒のピクセルをオレンジに、黄色のピクセルをピンクに変更したいとします。約 25 色を交換する必要があります。

私はすでにいくつかの調査を行っていますが、ある種の ColorModel を作成し、そのモデルから新しい BufferedImage を作成する必要があるように見えますか? ColorModel の作成方法がわからないので、そのためのチュートリアルがあれば非常に役に立ちます。

ありがとう!

4

2 に答える 2

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() );  
    }
}
于 2013-03-05T00:12:01.230 に答える