3

私は現在、swing を使用して Java でパックマンを設計しています。次のステートメントを使用して画面に描画される PNG 画像があります。

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

私が抱えている問題は、実際のファイルの色深度の表現が非常に低いように見えることです。透明度は保持されているように見えますが (灰色の背景はパネルの背景色です)、色深度が失われます。

実際のイメージは次のようになります。ここに画像の説明を入力 実行すると、次のようになります。ここに画像の説明を入力

誰にも解決策がありますか?ありがとう!

4

4 に答える 4

4

2番目の画像で何かが間違いなく間違っているようです。ここで黒い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

を使用Gridすると、ピクセルの上にマウスを置くと、アイコンの端でアルファコンポーネントがどのようにロールオフするかを確認できます。

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は、さまざまなアルファとデフォルトの 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 に答える
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 に答える
2

解決しました。paint() メソッドで repaint() が使用されました。それを削除し、それは動作します。

すべての助けをありがとう。

于 2013-01-21T05:12:42.750 に答える