Java 如何让图片不模糊
How to make a picture not blurry in Java
我在我的应用程序中截取了 table 的片段,我想在应用程序的教程部分显示该片段。我无法在不模糊的情况下显示它。我不知道是什么原因造成的。当我在 Windows 照片查看器中打开时,图片很好,但在应用程序中却很模糊。
我所有的图片都保存在我的项目中一个叫icons的包里,它们不是图片的链接,而是实际的拷贝。
这是我的代码的一个最小工作示例。如果有任何调整图像大小的东西导致图像质量下降,我该如何防止这种情况发生?
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Color;
import java.awt.Component;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import java.awt.Insets;
import java.awt.Font;
import java.awt.Dimension;
import javax.swing.JTextArea;
@SuppressWarnings("serial")
public class example extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
example frame = new example();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public example() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 558, 373);
contentPane = new JPanel();
contentPane.setBackground(Color.WHITE);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWidths = new int[]{0, 0};
gbl_contentPane.rowHeights = new int[]{0, 0};
gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gbl_contentPane.rowWeights = new double[]{1.0, Double.MIN_VALUE};
contentPane.setLayout(gbl_contentPane);
JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
GridBagConstraints gbc_panel = new GridBagConstraints();
gbc_panel.fill = GridBagConstraints.BOTH;
gbc_panel.gridx = 0;
gbc_panel.gridy = 0;
contentPane.add(panel, gbc_panel);
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[]{0, 0, 0};
gbl_panel.rowHeights = new int[]{0, 0, 0, 100, 0};
gbl_panel.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0,
Double.MIN_VALUE};
panel.setLayout(gbl_panel);
JLabel lblWordsGoHere = new JLabel("Words go here");
lblWordsGoHere.setFont(new Font("Tahoma", Font.PLAIN, 18));
GridBagConstraints gbc_lblWordsGoHere = new GridBagConstraints();
gbc_lblWordsGoHere.insets = new Insets(0, 0, 5, 0);
gbc_lblWordsGoHere.gridx = 1;
gbc_lblWordsGoHere.gridy = 0;
panel.add(lblWordsGoHere, gbc_lblWordsGoHere);
Component horizontalStrut = Box.createHorizontalStrut(20);
horizontalStrut.setPreferredSize(new Dimension(20, 20));
GridBagConstraints gbc_horizontalStrut = new GridBagConstraints();
gbc_horizontalStrut.insets = new Insets(0, 0, 5, 5);
gbc_horizontalStrut.gridx = 0;
gbc_horizontalStrut.gridy = 1;
panel.add(horizontalStrut, gbc_horizontalStrut);
JLabel lblNewLabel = new JLabel("More words here...");
lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 14));
GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
gbc_lblNewLabel.insets = new Insets(0, 0, 5, 0);
gbc_lblNewLabel.anchor = GridBagConstraints.WEST;
gbc_lblNewLabel.gridx = 1;
gbc_lblNewLabel.gridy = 1;
panel.add(lblNewLabel, gbc_lblNewLabel);
JLabel lblNewLabel_1 = new JLabel(new ImageIcon(example.class.getResource("/icons/Step3.png")));
GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 0);
gbc_lblNewLabel_1.gridx = 1;
gbc_lblNewLabel_1.gridy = 2;
panel.add(lblNewLabel_1, gbc_lblNewLabel_1);
JTextArea txtrLotsOfDescriptive = new JTextArea();
txtrLotsOfDescriptive.setFont(new Font("Monospaced", Font.PLAIN, 14));
txtrLotsOfDescriptive.setText("lots of descriptive words....");
GridBagConstraints gbc_txtrLotsOfDescriptive = new GridBagConstraints();
gbc_txtrLotsOfDescriptive.fill = GridBagConstraints.BOTH;
gbc_txtrLotsOfDescriptive.gridx = 1;
gbc_txtrLotsOfDescriptive.gridy = 3;
panel.add(txtrLotsOfDescriptive, gbc_txtrLotsOfDescriptive);
}
}
这是图片,来自应用程序的原始截图,您可以看出它看起来不错,这就是我希望它在应用程序中的外观和显示方式。
现在这是通过教程屏幕中的代码显示的图像的片段。它没有那么简洁,实际上看起来比显示的要差一些,因为剪辑放大了它。截图使这里更容易阅读,但您仍然可以看到它看起来不像另一张图片。它失去了一些质量,我不知道为什么或该怎么做。任何帮助和建议都会大有帮助!谢谢!
将此代码放在导入图像的位置:
Image image = null;
try {
image = ImageIO.read(new File("Images/image.png")).getScaledInstance(90, 90, Image.SCALE_SMOOTH);
} catch (IOException e) {
e.printStackTrace();
}
JLabel lblNewLabel_1 = new JLabel(new ImageIcon(image));
@camickr 的评论是我问题的答案。在我的 windows 设置中,我的缩放比例为 125%。我把它改成100%,我的画质大大提高了。看起来就像在照片查看器中一样。
我有同样的问题,我使用 java jdk-16.0.2 时图像像素化
真正的问题出在 JDK,当我将 JDK 更改为 OpenJDK 时,所有图像都正确显示。
您不必更改 windows 缩放比例,因为它会使一切变小。
我在我的应用程序中截取了 table 的片段,我想在应用程序的教程部分显示该片段。我无法在不模糊的情况下显示它。我不知道是什么原因造成的。当我在 Windows 照片查看器中打开时,图片很好,但在应用程序中却很模糊。
我所有的图片都保存在我的项目中一个叫icons的包里,它们不是图片的链接,而是实际的拷贝。
这是我的代码的一个最小工作示例。如果有任何调整图像大小的东西导致图像质量下降,我该如何防止这种情况发生?
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Color;
import java.awt.Component;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import java.awt.Insets;
import java.awt.Font;
import java.awt.Dimension;
import javax.swing.JTextArea;
@SuppressWarnings("serial")
public class example extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
example frame = new example();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public example() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 558, 373);
contentPane = new JPanel();
contentPane.setBackground(Color.WHITE);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWidths = new int[]{0, 0};
gbl_contentPane.rowHeights = new int[]{0, 0};
gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gbl_contentPane.rowWeights = new double[]{1.0, Double.MIN_VALUE};
contentPane.setLayout(gbl_contentPane);
JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
GridBagConstraints gbc_panel = new GridBagConstraints();
gbc_panel.fill = GridBagConstraints.BOTH;
gbc_panel.gridx = 0;
gbc_panel.gridy = 0;
contentPane.add(panel, gbc_panel);
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[]{0, 0, 0};
gbl_panel.rowHeights = new int[]{0, 0, 0, 100, 0};
gbl_panel.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0,
Double.MIN_VALUE};
panel.setLayout(gbl_panel);
JLabel lblWordsGoHere = new JLabel("Words go here");
lblWordsGoHere.setFont(new Font("Tahoma", Font.PLAIN, 18));
GridBagConstraints gbc_lblWordsGoHere = new GridBagConstraints();
gbc_lblWordsGoHere.insets = new Insets(0, 0, 5, 0);
gbc_lblWordsGoHere.gridx = 1;
gbc_lblWordsGoHere.gridy = 0;
panel.add(lblWordsGoHere, gbc_lblWordsGoHere);
Component horizontalStrut = Box.createHorizontalStrut(20);
horizontalStrut.setPreferredSize(new Dimension(20, 20));
GridBagConstraints gbc_horizontalStrut = new GridBagConstraints();
gbc_horizontalStrut.insets = new Insets(0, 0, 5, 5);
gbc_horizontalStrut.gridx = 0;
gbc_horizontalStrut.gridy = 1;
panel.add(horizontalStrut, gbc_horizontalStrut);
JLabel lblNewLabel = new JLabel("More words here...");
lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 14));
GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
gbc_lblNewLabel.insets = new Insets(0, 0, 5, 0);
gbc_lblNewLabel.anchor = GridBagConstraints.WEST;
gbc_lblNewLabel.gridx = 1;
gbc_lblNewLabel.gridy = 1;
panel.add(lblNewLabel, gbc_lblNewLabel);
JLabel lblNewLabel_1 = new JLabel(new ImageIcon(example.class.getResource("/icons/Step3.png")));
GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 0);
gbc_lblNewLabel_1.gridx = 1;
gbc_lblNewLabel_1.gridy = 2;
panel.add(lblNewLabel_1, gbc_lblNewLabel_1);
JTextArea txtrLotsOfDescriptive = new JTextArea();
txtrLotsOfDescriptive.setFont(new Font("Monospaced", Font.PLAIN, 14));
txtrLotsOfDescriptive.setText("lots of descriptive words....");
GridBagConstraints gbc_txtrLotsOfDescriptive = new GridBagConstraints();
gbc_txtrLotsOfDescriptive.fill = GridBagConstraints.BOTH;
gbc_txtrLotsOfDescriptive.gridx = 1;
gbc_txtrLotsOfDescriptive.gridy = 3;
panel.add(txtrLotsOfDescriptive, gbc_txtrLotsOfDescriptive);
}
}
这是图片,来自应用程序的原始截图,您可以看出它看起来不错,这就是我希望它在应用程序中的外观和显示方式。
现在这是通过教程屏幕中的代码显示的图像的片段。它没有那么简洁,实际上看起来比显示的要差一些,因为剪辑放大了它。截图使这里更容易阅读,但您仍然可以看到它看起来不像另一张图片。它失去了一些质量,我不知道为什么或该怎么做。任何帮助和建议都会大有帮助!谢谢!
将此代码放在导入图像的位置:
Image image = null;
try {
image = ImageIO.read(new File("Images/image.png")).getScaledInstance(90, 90, Image.SCALE_SMOOTH);
} catch (IOException e) {
e.printStackTrace();
}
JLabel lblNewLabel_1 = new JLabel(new ImageIcon(image));
@camickr 的评论是我问题的答案。在我的 windows 设置中,我的缩放比例为 125%。我把它改成100%,我的画质大大提高了。看起来就像在照片查看器中一样。
我有同样的问题,我使用 java jdk-16.0.2 时图像像素化 真正的问题出在 JDK,当我将 JDK 更改为 OpenJDK 时,所有图像都正确显示。 您不必更改 windows 缩放比例,因为它会使一切变小。