简体   繁体   English

Java中如何使图片不模糊

[英]How to make a picture not blurry in Java

I took a snip of a table in my application, and i want to display that snip in a tutorial section of the app.我在我的应用程序中截取了一张表格,我想在应用程序的教程部分显示该片段。 I can not get it to display with out being blurry.我无法让它在不模糊的情况下显示。 I don't know what is causing this.我不知道这是什么原因造成的。 The picture is fine when i open it up in Windows photo viewer, but in the app it is blurry.当我在 Windows 照片查看器中打开它时,图片很好,但在应用程序中它是模糊的。

All my pictures are stored in a package called icons in my project, and they are not links to the pictures but actual copies.我所有的图片都存储在我的项目中称为图标的 package 中,它们不是图片的链接,而是实际的副本。

Here is a minimal working example of my code.这是我的代码的最小工作示例。 If anything that resizes the image, makes it lose quality how i can i prevent that?如果有任何调整图像大小的东西,使它失去质量,我该如何防止呢?

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

}

here is the image, the original snip from application, as you can tell it looks alright and this is how i would want it to look and display in the app.这是图像,来自应用程序的原始片段,您可以说它看起来不错,这就是我希望它在应用程序中的外观和显示方式。

在此处输入图像描述

now here is the snip from the image being displayed via the code in the tutorial screen.现在这里是通过教程屏幕中的代码显示的图像的片段。 it's not as concise and it actually looks a bit worse than what is shown because the snip enlarged it.它没有那么简洁,实际上看起来比显示的要差一些,因为剪辑放大了它。 The snip makes it a little easier to read here, but you can still see that it doesn't look like the other picture.该片段使此处的阅读更容易一些,但您仍然可以看到它看起来不像另一张图片。 it has lost some quality and i don't know why or what to do about it.它失去了一些质量,我不知道为什么或该怎么做。 Any help and suggestions would go a long way!任何帮助和建议都会让 go 有很长的路要走! thank you!谢谢你!

在此处输入图像描述

Put this code where you import the image:将此代码放在导入图像的位置:

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

A comment from @camickr was the answer to my problem. @camickr 的评论是我问题的答案。 My scaling was on 125% in my windows settings.在我的 windows 设置中,我的缩放比例为 125%。 I changed it to 100% and my picture quality improved greatly.我把它改成100%,我的画质大大提高了。 Looks just it does in the photo viewer.看起来就像在照片查看器中一样。

I have the same problem, images are pixelated when I was using java jdk-16.0.2 The real problem is in JDK, when I change my JDK to OpenJDK all the images are displaying correctly.我有同样的问题,当我使用 java jdk-16.0.2 时图像像素化 真正的问题出在 JDK 中,当我将 JDK 更改为 OpenJDK 时,所有图像都正确显示。 You don't have to change windows scaling as it make everything small.您不必更改 windows 缩放比例,因为它会使所有内容变小。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM