java - 口袋妖怪黄色包装过渡

标签 java algorithm graphics2d

<分区>

所以我一直在尝试制作一个非常准确的旧口袋妖怪黄色的克隆很长一段时间,一个令人费解但仍然微妙的机制让我感到困惑。正如您在上传的图像中看到的那样,在进入另一个游戏位置(例如楼梯或进入建筑物)后,分两个阶段进行了特定的颜色处理。

实现这一目标的一种简单(草率)方法,也是我目前一直在使用的方法,是为每个图像(sprite tilemaps、town images)制作三个 png,所有这些图像的颜色都相应调整以匹配每个阶段过渡。当然,一段时间后,这会变得非常耗时。

所以我的问题是有没有人知道使用 java 和 Graphics2D 实现这种颜色处理效果的更好方法?

提前致谢

亚历克斯

Wrap transition

最佳答案

我不知道是否有用于循环图像中颜色的内置函数。我认为应该有,但我找不到。

无论如何,一种方法是遍历图像中的所有像素,在预定义的颜色列表中查找颜色,从亮到暗,并使每个像素“更暗”​​。

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 屏幕,这应该可行。因此,如果您要应用任何滤镜(例如放大图像以便在现代屏幕上播放或消除锯齿),您应该此色移操作之后应用这些滤镜。此外,您还必须调整颜色以适应图像中使用的四种颜色。

完整示例代码:

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

enter image description here

关于java - 口袋妖怪黄色包装过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25402251/

相关文章:

python - 使用 Python 的 PIL,如何增强图像的对比度/饱和度?

algorithm - 求二叉树直径的时间复杂度

javascript - 销售点系统

Java小程序重画一个移动的圆圈

java - Maven Release Plugin 不更新 dependencyManagement 中的 SNAPSHOT

java - 尝试将开放处理代码转换为pj.5s

java - 继续循环直到良好的输入?

java - 循环中没有重复的随机数

java - drawLine 不会在 BufferedImage 上画线

java - 在 Java 中旋转缓冲图像