调色板交换java中的BuffereImage
我需要为我正在制作的游戏中的角色精灵做一个调色板交换,因此如果多个玩家选择相同的角色,他们将使用不同的颜色。我已将所有精灵存储在BuffereImage中,并希望动态更改调色板 例如,我想将任何红色像素更改为蓝色,任何黑色像素更改为橙色,任何黄色像素更改为粉色。我需要交换大约25种颜色 我已经做了一些研究,看起来我必须创建某种颜色模型,并从该模型创建一个新的BuffereImage?我不知道如何创建一个ColorModel,所以如果有相关的教程,那将非常有帮助调色板交换java中的BuffereImage,java,image-processing,image-manipulation,Java,Image Processing,Image Manipulation,我需要为我正在制作的游戏中的角色精灵做一个调色板交换,因此如果多个玩家选择相同的角色,他们将使用不同的颜色。我已将所有精灵存储在BuffereImage中,并希望动态更改调色板 例如,我想将任何红色像素更改为蓝色,任何黑色像素更改为橙色,任何黄色像素更改为粉色。我需要交换大约25种颜色 我已经做了一些研究,看起来我必须创建某种颜色模型,并从该模型创建一个新的BuffereImage?我不知道如何创建一个ColorModel,所以如果有相关的教程,那将非常有帮助 谢谢 如果速度不重要,我会选择最愚
谢谢 如果速度不重要,我会选择最愚蠢的解决方案:只需手动交换颜色 您可以使用获取所有像素值。然后检查颜色是否在您的列表中,并相应地替换它。稍后可以使用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() );
}
}
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.HashMap;
导入javax.imageio.imageio;
公开课{
公共静态void main(字符串[]args)引发IOException{
BuffereImage img=新的BuffereImage(20,20,BuffereImage.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.black,Color.white,//用白色替换黑色
Color.white、Color.green//和白色加绿色
};
write(img,“png”,新文件(“original.png”);
swapColors(img,映射);
write(img,“png”,新文件(“swapped.png”);
}
公共静态空白交换颜色(BuffereImage img、颜色…映射){
int[]pixels=img.getRGB(0,0,img.getWidth(),img.getHeight(),null,0,img.getWidth());
HashMap=newHashMap();
对于(int i=0;i
以下代码通过构建共享原始光栅数据的新BuffereImage来交换调色板。因此,它运行速度很快,不占用太多内存
static BufferedImage switchPalette(BufferedImage bi,
IndexColorModel icm) {
WritableRaster wr = bi.getRaster();
boolean bAlphaPremultiplied = bi.isAlphaPremultiplied();
return new BufferedImage(icm, wr, bAlphaPremultiplied, new Hashtable());
}
您使用抗锯齿还是图像仅使用精确颜色?精确颜色:它们是Megaman Xah的16位精灵,然后您可以直接交换。。我将在一分钟后发布一个示例ID我的代码可以帮助您吗?很抱歉这么晚了,我昨晚问了这个问题,所以我只是尝试了一下。非常好,非常感谢!在我的例子中,原始缓冲图像具有不同的颜色模型。我似乎遇到了一个异常,说光栅与颜色模型不兼容。我能做些什么来解决这个问题?