我不知道是否有用于循环图像中颜色的内置函数.我认为应该有,但我找不到一个.
无论如何,这样做的一种方法是循环遍历图像中的所有像素,在预定义的颜色列表中查找颜色,从亮到暗,并使每个像素“一个更暗”.
public static void shiftToBlack(BufferedImage img) {
// the four colors used in test.png, from bright to dark
List 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屏幕,这应该可行.因此,如果要应用任何滤镜(如放大图像以在现代屏幕上播放或消除锯齿),则应在此色彩移动操作后应用这些滤镜.此外,您还必须根据图像中使用的四种颜色调整颜色.
完整示例代码:
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