因此,我一直试图在很长一段时间内完美地克隆好古老的口袋妖怪黄色,一个令人费解但仍然微妙的机制让我感到困惑。正如您在上传的图像中看到的那样,在进入另一个游戏位置(例如楼梯或进入建筑物)后,在两个阶段中进行了某种颜色操作。
实现这一目标的一种简单(和草率)的方式和我迄今为止使用的方法是为每个图像(精灵图块图,城镇图像)制作三个png,所有图像的颜色都相应调整以匹配每个阶段过渡。当然,经过一段时间后,这将变得非常耗时。
所以我的问题是有没有人知道使用java和Graphics2D实现这种颜色处理效果的更好方法?
提前致谢,
亚历
答案 0 :(得分:4)
我不知道是否有用于循环图像中颜色的内置功能。我认为应该,但我找不到。
无论如何,这样做的一种方法是循环遍历图像中的所有像素,在预定义的颜色列表中查找颜色,从亮到暗,并使每个像素都变得更暗" ;
public static void shiftToBlack(BufferedImage img) {
// the four colors used in test.png, from bright to dark
List<Integer> colors = Arrays.asList(-196868, -4088073, -10112268, -12500653);
for (int i = 0; i < img.getRaster().getWidth(); i++) {
for (int k = 0; k < img.getRaster().getHeight(); k++) {
int c = img.getRGB(i, k);
int index = colors.indexOf(c);
int c2 = index < colors.size() - 1 ? colors.get(index+1) : c;
img.setRGB(i, k, c2);
}
}
}
当然,当图像较大时,这不能很好地扩展,但对于典型的四色Game Boy屏幕,这应该可行。因此,如果要应用任何滤镜(如放大图像以在现代屏幕上播放或消除锯齿),则应在此色彩移动操作后应用。此外,您必须使colors
适应图片中使用的四种颜色。
完整的示例代码:
BufferedImage img = ImageIO.read(new File("test.png"));
JComponent component = new JComponent() {
protected void paintComponent(Graphics graphics) {
graphics.drawImage(img, 0, 0, null);
};
};
component.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
shiftToBlack(img);
component.repaint();
}
});
JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(component);
frame.pack();
frame.setSize(150, 150);
frame.setVisible(true);
我的test.png