Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing中的PNG渲染错误(颜色深度低)_Java_Image_Swing_Png - Fatal编程技术网

Java Swing中的PNG渲染错误(颜色深度低)

Java Swing中的PNG渲染错误(颜色深度低),java,image,swing,png,Java,Image,Swing,Png,我目前正在使用swing在java中设计PacMan。我用下面的语句在屏幕上绘制PNG图像 wall = new ImageIcon(GamePanel.class.getResource("wall.png")).getImage(); g2d.drawImage(wall, x, y, this); 我遇到的问题是,它似乎呈现了实际文件的非常低的颜色深度格式副本。看起来它确实保持了透明度(灰色背景是面板背景色),但它失去了颜色深度 实际图像如下所示:运行时,它如下所示: 有人有解决办法吗

我目前正在使用swing在java中设计PacMan。我用下面的语句在屏幕上绘制PNG图像

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

我遇到的问题是,它似乎呈现了实际文件的非常低的颜色深度格式副本。看起来它确实保持了透明度(灰色背景是面板背景色),但它失去了颜色深度

实际图像如下所示:运行时,它如下所示:


有人有解决办法吗?谢谢

在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);
Map Map=newhashmap();
map.put(RenderingHints.KEY\u插值,RenderingHints.VALUE\u插值双三次);
map.put(RenderingHints.KEY\u RENDERING,RenderingHints.VALUE\u RENDER\u QUALITY);
map.put(RenderingHints.KEY\u抗锯齿,RenderingHints.VALUE\u抗锯齿开);
RenderingHints renderHints=新的RenderingHints(地图);
g2d.setRenderingHints(renderHints);

在第二张图片中,似乎有什么地方出了问题。在黑色背景上看到它,它看起来非常不同-没有“光环”

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);
    }
}

使用,可以将鼠标悬停在像素上,以查看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\u规则呈现

/*** @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);
            }
        });
    }
}

/***@请参见https://stackoverflow.com/a/14432025/230513 */
公共类IconTest{
专用静态最终整数N=8;
私有静态最终随机r=新随机();
publicstaticvoidmain(字符串[]args)引发畸形的DurLexException{
最终URL=新URL(“http://i.stack.imgur.com/1EZVZ.png");
最终图标=新图像图标(url);
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新的JFrame(“IconTest”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p=newjpanel(newgridlayout(N,N));
对于(int i=0;i
已解决。在paint()方法中使用了repaint()。删除它,它的工作


谢谢您的帮助。

尝试使用
ImageIO
加载图像,而不是使用
ImageIcon
。当
ImageIO
在加载过程中阻塞时,
ImageIcon
异步加载。IIUC,
ImageIcon(url)
表示“图像将被预加载…”在内部,它使用
loadImage()
,它“加载图像,仅在加载图像时返回”。@trashgod-Huh。好吧,那么,我唯一剩下的反对意见是,它有时会无声地失败(虽然这里显然不是这样);非常感谢。仔细看,至少有一个实现使用
System.out.println()
处理
InterruptedException
!在我的机器上运行此代码时,我会得到相同的结果。所以一定是我以前的代码。我会把它全部贴出来。“解决了。”祝贺你!很高兴你把它整理好了。:)@user1305850:如果我打扰了,很抱歉。:-)你问题中变暗的图像让我想起了反复应用默认的
AlphaComposite.SRC_OVER
规则的结果,因此你的答案似乎是合理的。奥托,你接受别人的回答得两分!