gpt4 book ai didi

JAR 文件中的 Java 图像缩放质量丢失

转载 作者:行者123 更新时间:2023-11-30 08:16:59 26 4
gpt4 key购买 nike

我正在编写一个程序,它有一个完整的 JPanel 放大了一个 JScrollPane 作为 map ,但我也想给用户一个缩放和最小化的 View 整个 map 在 JScrollPane 的一角。我正在使用 BlueJ,&(至少在 BlueJ 中)我基本上已经得到了我想要的东西。为了缩小 map ,我创建了一个 BufferedImagebi,这是迷你 map 的大小,然后获取它的 Graphics 对象, g, 将其转换为Graphics2D 对象, g2, 然后给g2 一组 RenderingHints,通过:

g2.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON));

从那里开始,我在 g2 上使用 Graphics.scale(double sx, double sy) 方法来设置比例,以便在调用 paint( Graphics g) 大 map 的方法,以g2 为参数,它会在bi 上绘制大 map 的缩放版本,它的大小与小 map 。这种情况每秒发生 20 次(有点武断,以这种速度我认为它看起来最好。迷你 map 实时反射(reflect)了用户正在做的事情并且我认为如果每秒完成少于 20 次它看起来很滞后。)

在我的 Macbook Pro 上,这段代码的结果是:

enter image description here
当我运行程序时,这段代码没有明显的滞后,这导致我将图片重新采样保持在每秒 20 次,因为似乎有足够的 CPU 用于此。但是,将我的项目导出到 JAR 文件后,结果如下:

enter image description here
程序运行仍然没有延迟,但到底发生了什么?只要我在 BlueJ 中运行代码,它就可以工作 - 但在 JAR 文件中,迷你 map 看起来很糟糕。

为了澄清,这是要缩放的 map (具有讽刺意味的是,当我将它放在这篇文章中时,它正在缩放): enter image description here这是两个并排的 BlueJ 和 JAR 文件迷你 map :

enter image description here enter image description here

这可能是什么原因造成的?当我运行“java -version”时,这是输出:

Java 版本“1.8.0_31”
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64 位服务器 VM(构建 25.31-b07,混合模式)

Tl;博士:
当我在 BlueJ 中运行我的代码时,小图片看起来不错。导出为 JAR 文件后,它看起来很糟糕。可能是什么原因造成的?


编辑:我现在包括一个 SSCCE,以便更好地理解我的意思。

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.border.*;

public class ScaleTest
{
int scrollSpeed = 16, imageSize = 200;
int rows = 40, columns = 40;
JFrame f1 = new JFrame("ScaleTest: Full Size");
JScrollPane scrollPane = new JScrollPane();
JPanel f1Panel = new JPanel(new GridLayout(rows,columns,1,1));
JFrame f2 = new JFrame("ScaleTest: Scaled");
JPanel f2Panel = new JPanel()
{
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
g2.drawImage(bi,0,0,null);
}
};
BufferedImage bi = new BufferedImage(imageSize,imageSize,BufferedImage.TYPE_INT_ARGB);

public ScaleTest()
{
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.add(scrollPane);
scrollPane.setPreferredSize(new Dimension(600,600));
scrollPane.getHorizontalScrollBar().setUnitIncrement(scrollSpeed);
scrollPane.getVerticalScrollBar().setUnitIncrement(scrollSpeed);
scrollPane.setViewportView(f1Panel);
for (int i = 0; i < rows*columns; i++)
{
JPanel p = new JPanel();
p.setBackground(Color.WHITE);
p.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
p.setPreferredSize(new Dimension(100,100));
f1Panel.add(p);
}
f1.pack();

f2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f2.setResizable(false);
f2.add(f2Panel);
f2Panel.setPreferredSize(new Dimension(imageSize,imageSize));
f2.pack();

Graphics2D g2 = (Graphics2D)bi.getGraphics();
g2.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON));
g2.scale(((double)imageSize)/f1Panel.getWidth(),((double)imageSize)/f1Panel.getHeight());
f1Panel.paint(g2);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
public static void createAndShowGUI()
{
ScaleTest s = new ScaleTest();
s.f1.setVisible(true);
s.f2.setVisible(true);
}
}

在 BlueJ 中生成的缩放图像是这样的:
enter image description here
然而,在从 BlueJ 生成的 JAR 文件中,运行 JAR 会生成此图像:
enter image description here
可能发生了什么?

最佳答案

我猜你的 BlueJ 使用 JDK1.6.0。

  • Java 版本“1.6.0_45”

enter image description here

  • Java 版本“1.8.0_31”

enter image description here

关于JAR 文件中的 Java 图像缩放质量丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28080302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com