3

我目前正在使用 swing 用 java 设计吃豆人。我有使用以下语句在屏幕上绘制的 PNG 图像。

wall = new ImageIcon(GamePanel.class.getResource("wall.png")).getImage();
g2d.drawImage(wall, x, y, this);

我遇到的问题是它似乎渲染了实际文件的非常低的颜色深度再现。看起来它确实保留了透明度(灰色背景是 Panel bg 颜色),但它失去了颜色深度。

实际图像如下所示:在此处输入图像描述 运行时,如下所示:在此处输入图像描述

有没有人有办法解决吗?谢谢!

4

4 回答 4

4

在第二张图片中似乎肯定有问题。在黑色 BG 上看到它,它看起来非常不同 - 没有“光环”。

测试黄点图像

import java.awt.*;
import java.net.URL;
import javax.swing.*;

public class TestYellowDotImage {

    public static JLabel getColoredLabel(Icon icon, Color color) {
        JLabel label = new JLabel(icon);
        label.setBackground(color);
        label.setOpaque(true);

        return label;
    }

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://i.stack.imgur.com/1EZVZ.png");
        final Icon icon = new ImageIcon(url);
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new GridLayout(0, 4));

                gui.add(new JLabel(icon));
                gui.add(getColoredLabel(icon, Color.BLACK));
                gui.add(getColoredLabel(icon, Color.WHITE));
                gui.add(getColoredLabel(icon, Color.RED));

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}
于 2013-01-21T02:15:19.573 回答
3

试试这个设置g2d:-

    Map<RenderingHints.Key, Object> map = new HashMap<RenderingHints.Key, Object>();
    map.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    map.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    map.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    RenderingHints renderHints = new RenderingHints(map);
    g2d.setRenderingHints(renderHints);
于 2013-01-21T01:31:56.620 回答
3

使用Grid,您可以将鼠标悬停在像素上,以查看 alpha 分量如何在图标边缘滚动。

public Grid(String name) {
    this.setBackground(new Color(0xFFFFFFC0));
    Icon icon = null;
    try {
        icon = new ImageIcon(new URL("http://i.stack.imgur.com/1EZVZ.png"));
    } catch (MalformedURLException e) {
        e.printStackTrace(System.err);
    }
    ...
}

图片

IconTest显示了图标如何以不同的 alpha 和默认 AlphaComposite.SRC_OVER规则呈现。

在此处输入图像描述

/*** @see https://stackoverflow.com/a/14432025/230513 */
public class IconTest {

    private static final int N = 8;
    private static final Random r = new Random();

    public static void main(String[] args) throws MalformedURLException {
        final URL url = new URL("http://i.stack.imgur.com/1EZVZ.png");
        final Icon icon = new ImageIcon(url);
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("IconTest");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel p = new JPanel(new GridLayout(N, N));
                for (int i = 0; i < N * N; i++) {
                    final JLabel label = new JLabel(icon);
                    label.setOpaque(true);
                    label.setBackground(new Color(0, 0, 255, i));
                    p.add(label);
                }
                f.add(p);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}
于 2013-01-21T03:16:35.280 回答
2

解决了。在paint() 方法中使用了repaint()。删除它,它的工作原理。

感谢所有的帮助。

于 2013-01-21T05:12:42.750 回答