Java 如何停止JLabel缩放图像?

Java 如何停止JLabel缩放图像?,java,swing,java-9,image-scaling,highdpi,Java,Swing,Java 9,Image Scaling,Highdpi,我有一个Swing应用程序,可以通过将图像加载到JLabel中来显示图像。在Java8之前,这种方法工作得很好。自从Java 9以来,有一些变化旨在使应用程序在更高的像素密度下调整大小,包括重新缩放图像:当像素密度较高时,图像会被放大。结果在很多情况下都很糟糕。举个例子,如果我有一张高像素数的照片,我的应用程序会缩小它以适应可用空间,但随后它会自动缩小以允许更高的像素密度-丑陋 我可以看到几个避免此问题的选项: 实现接口java.awt.image.MultiResolutionImage,这看

我有一个Swing应用程序,可以通过将图像加载到
JLabel
中来显示图像。在Java8之前,这种方法工作得很好。自从Java 9以来,有一些变化旨在使应用程序在更高的像素密度下调整大小,包括重新缩放图像:当像素密度较高时,图像会被放大。结果在很多情况下都很糟糕。举个例子,如果我有一张高像素数的照片,我的应用程序会缩小它以适应可用空间,但随后它会自动缩小以允许更高的像素密度-丑陋

我可以看到几个避免此问题的选项:

  • 实现接口
    java.awt.image.MultiResolutionImage
    ,这看起来应该会有所帮助,但我不知道如何使用
    JLabel
  • 也许有一种方法可以愚弄Swing,使其认为不需要像素缩放,但我找不到任何类似的方法
  • 下面的代码是在标签中显示图像的简单示例。在Java8中,图像逐像素显示。在Java9+中,包括图像在内的整个UI都会根据操作系统认为的像素密度进行放大。您应该能够显式设置此缩放-Windows 10将其置于“显示”、“缩放和布局”下。我的设置为125%,这似乎是一个完美的数量,使几乎任何图像看起来丑陋

    import java.awt.*;
    import javax.imageio.*;
    import javax.swing.*;
    import java.io.*;
    
    public class Img extends JFrame {
        public static void main( String[] args ) throws IOException {
            new Img( new File( args[0] ) );
        }
    
        private Img( File file ) throws IOException {
            super( "Img: " + file.getName () );
            ImageIcon img = new ImageIcon( ImageIO.read( file ) );
            JLabel label = new JLabel( img );
            label.setPreferredSize( new Dimension( img.getIconWidth(), img.getIconHeight() ) );
            add( label );
            setDefaultCloseOperation( EXIT_ON_CLOSE );
            pack();
            setVisible( true );
        }
    }
    
    如果我有一张高像素的照片,我的应用程序会将其缩小以适应可用空间-请查看。它将动态缩放。无论使用100%还是150%,我都能看到相同大小的图像。也就是说,无论哪种方式,图像都会填满屏幕。当然,如果图像比屏幕小,那么我仍然会遇到放大问题。如果我有一张像素数高的照片,我的应用程序会缩小它以适应可用空间-请查看。它将动态缩放。无论使用100%还是150%,我都能看到相同大小的图像。也就是说,无论哪种方式,图像都会填满屏幕。当然,如果图像比屏幕小,那么我仍然会遇到放大问题。