Как сделать картинку не размытой в Java - PullRequest
1 голос
/ 01 мая 2020

Я взял фрагмент таблицы в своем приложении и хочу отобразить этот фрагмент в разделе учебника приложения. Я не могу заставить его отображаться без размытия. Я не знаю, что вызывает это. Картинка в порядке, когда я открываю ее в Windows программе просмотра фотографий, но в приложении она размыта.

Все мои изображения хранятся в пакете, называемом значками в моем проекте, и они не являются ссылками на изображения, а представляют собой настоящие копии.

Вот минимальный рабочий пример моего кода. Если что-то изменяет размер изображения, заставляет его терять качество, как я могу это предотвратить?

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

}

вот изображение, исходный фрагмент приложения, так как вы можете сказать, что оно выглядит хорошо, и вот как я хотел бы, чтобы это выглядело и отображалось в приложении.

enter image description here

Теперь вот фрагмент изображения, отображаемого с помощью кода на экране учебника. это не так кратко, и это на самом деле выглядит немного хуже, чем показано, потому что отрывок увеличил его. Снимок облегчает чтение, но вы все равно можете видеть, что он не похож на другой рисунок. он потерял некоторое качество, и я не знаю, почему или что с этим делать. Любая помощь и предложения будут go долгий путь! спасибо!

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Комментарий @camickr был ответом на мою проблему. В моих настройках windows мое масштабирование составило 125%. Я изменил его на 100%, и качество моего изображения значительно улучшилось. Выглядит так же, как в программе просмотра фотографий.

0 голосов
/ 04 мая 2020

Поместите этот код туда, где вы импортируете изображение:

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