Контроль качества изображения на стороне приложения Java - PullRequest
1 голос
/ 05 мая 2020

Я разместил здесь вопрос с вопросом, что делать с размытым изображением в приложении java. Я обнаружил, что мое масштабирование windows вызывает размытость. Теперь у меня более серьезная проблема. Я хочу, чтобы качество изображения и приложения контролировалось через приложение, без необходимости изменять какие-либо настройки windows, если это вообще возможно.

Вместо изменения масштабирования обратно на 100% было еще одно предложение windows от здесь , в котором говорилось об изменении настроек совместимости java .exe и / или javaw.exe на переопределите настройки высокого разрешения, чтобы система выполняла масштабирование. Он работает, так как изображение более четкое, но текст теряет четкость.

Лучшее качество, которое я обнаружил для приложения, - это не переопределять высокое разрешение, а просто установить масштабирование на 100%. Текст четкий и ясный, как и изображение.

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

вот пример программы с моим масштабированием на 125%. Картинка размытая, но текст хороший. enter image description here

Вот пример переопределения DPI системой с масштабированием по-прежнему на 125%, обратите внимание, что текст теряет четкость, но изображение лучше.

enter image description here

наконец, масштабирование составляет 100%, и DPI больше не переопределяется. это лучшее качество текста и изображения

enter image description here

вот пример кода, если кому-то он нужен.

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("Cambria Math", 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("Cambria Math", 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.setLineWrap(true);
    txtrLotsOfDescriptive.setWrapStyleWord(true);
    txtrLotsOfDescriptive.setEditable(false);
    txtrLotsOfDescriptive.setFont(new Font("Cambria Math", Font.PLAIN, 14));
    txtrLotsOfDescriptive.setText("Lorem ipsum dolor sit amet, eu tempor maluisset eum. Ipsum detracto mediocrem quo eu. Eos ad ocurreret argumentum. Cum ei vero ipsum alienum, has sonet impetus repudiandae at, cu viris assentior eum.");
    GridBagConstraints gbc_txtrLotsOfDescriptive = new GridBagConstraints();
    gbc_txtrLotsOfDescriptive.fill = GridBagConstraints.BOTH;
    gbc_txtrLotsOfDescriptive.gridx = 1;
    gbc_txtrLotsOfDescriptive.gridy = 3;
    panel.add(txtrLotsOfDescriptive, gbc_txtrLotsOfDescriptive);
}

}

...