Mr. Feng in Ginlin 2024-05-19 20:05 采纳率: 40%
浏览 9

为什么JFrame导入PNG图片后,图片被自动放大,产生失真的现象?

为什么我的PNG图片,在JFrame导入后,我调整了缩放比例后,图片却变得这么模糊了?
不应该是,图片被缩得越小,其清晰度越高吗?
我之前在导入其它图片的时候,就经常遇到这个问题。


img




图片原本的尺寸


img




在我没有设置图片规格,直接导入PNG图片的时候是这样的。很明显的图片被自动放大了

img


MyAnonymous.java

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.util.ArrayList;

public class MyAnonymous extends JFrame {

    MyAnonymous() {

        ArrayList<JLabel> desk = new ArrayList<>();
        File file = new File("D:\\Documents\\javabro\\scr\\image\\playingCards");

        if (file.exists()) {
            File[] files = file.listFiles();
            assert files != null;
            int index = 0;
            ImageIcon one = null;
            JLabel two = null;

            for (File i : files) {
                String name = i.getName();

                one = new ImageIcon("scr\\image\\playingCards\\"+ name);
                one.setImage(one.getImage().getScaledInstance(one.getIconWidth()/4, one.getIconHeight()/4, Image.SCALE_DEFAULT));
                two = new JLabel(one);
                desk.add(two);
                this.add(desk.get(index));
                index++;
            }

            System.out.println(index);

        }

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(420, 420);
        this.setLayout(new FlowLayout());
        this.setVisible(true);
    }
}


Main.java
public class Main {
    public static void main(String[] args) throws InterruptedException {
    new MyAnonymous();
    }
}

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-19 20:05
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题:您提问的目的是解决在Java Swing应用程序中使用JFrame导入PNG图片时,图片被自动放大并失真的问题。

    图片内容

    1. 第一张图片(d3f5d715-270b-498e-bd1c-2a71c63340ee_3b52deff60df4f64b19762dc4c707876.png)是一张扑克牌的图片,看起来是2_of_clubs。
    2. 第二张图片(18fe02b0-b619-4917-8350-031b0e732ca1_440c27c863ba426e94d9cf2f06e3b449.png)显示了Java代码的截图,其中包含了MyAnonymous类的定义,该类继承自JFrame,并在构造函数中加载和显示图片。
    3. 第三张图片(bfd7117f-2ee9-4927-ac5e-b23668978796_e8b3f69185c1434c83eb5ae009fd9ca1.png)显示了2_of_clubs.png文件的详细信息,包括尺寸、大小、分辨率等。

    问题出现原因:问题出现的原因是在缩放图片时使用了Image.SCALE_DEFAULT作为缩放模式。这个模式会尽量保持图片的长宽比,但可能会使用像素插值,导致图片失真。另外,图片的原始分辨率(dpi)和显示分辨率(dpi)不匹配也可能导致图片显示模糊。

    问题解决方案:为了解决这个问题,可以采用以下步骤:

    1. 使用Image.SCALE_SMOOTH代替Image.SCALE_DEFAULT来获得更平滑的缩放效果。
    2. 确保图片的分辨率与显示设备的分辨率相匹配,或者在设计时就考虑到可能的缩放。
    3. 可以考虑使用其他图像处理库,如Apache Commons Imaging,来获得更好的图像处理能力。

    提供代码: 修改后的MyAnonymous.java代码如下:

    import javax.swing.*;
    import java.awt.*;
    import java.io.File;
    import java.util.ArrayList;
    
    public class MyAnonymous extends JFrame {
    
        MyAnonymous() {
    
            ArrayList<JLabel> desk = new ArrayList<>();
            File file = new File("D:\\Documents\\javabro\\scr\\image\\playingCards");
    
            if (file.exists()) {
                File[] files = file.listFiles();
                assert files != null;
                int index = 0;
                ImageIcon one = null;
                JLabel two = null;
    
                for (File i : files) {
                    String name = i.getName();
    
                    one = new ImageIcon("scr\\image\\playingCards\\"+ name);
                    one.setImage(one.getImage().getScaledInstance(one.getIconWidth()/4, one.getIconHeight()/4, Image.SCALE_SMOOTH));
                    two = new JLabel(one);
                    desk.add(two);
                    this.add(desk.get(index));
                    index++;
                }
    
                System.out.println(index);
    
            }
    
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(420, 420);
            this.setLayout(new FlowLayout());
            this.setVisible(true);
        }
    }
    

    代码运行方式:将修改后的代码复制到Java开发环境中,确保图片路径正确,然后在Java环境中运行。

    代码预期运行结果:图片应该会以更平滑的方式缩放,减少了失真。

    推荐相关链接

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月19日
  • 创建了问题 5月19日

悬赏问题

  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?