Java Swing中的PNG渲染错误(颜色深度低)
我目前正在使用swing在java中设计PacMan。我用下面的语句在屏幕上绘制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); 我遇到的问题是,它似乎呈现了实际文件的非常低的颜色深度格式副本。看起来它确实保持了透明度(灰色背景是面板背景色),但它失去了颜色深度 实际图像如下所示:运行时,它如下所示: 有人有解决办法吗
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
规则的结果,因此你的答案似乎是合理的。奥托,你接受别人的回答得两分!