You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中图片缩小后画质劣化的问题求助

Java中图片缩小后画质劣化的问题求助

我现在在做一个Java程序,想把图片缩小后显示在JFrame上,但缩小后的画质变得很差,完全达不到预期效果。

我的代码如下:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Mu {
    public static void main(String[] str) {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();
        int width = screenSize.width;
        int height = screenSize.height;

        System.setProperty("sun.java2d.opengl", "true");
        
        MyFrame appwin = new MyFrame();
        appwin.setSize(new Dimension(appwin.w, appwin.h));
        appwin.setResizable(false);
        appwin.setAlwaysOnTop(true);
        
        Random r = new Random();
        appwin.setLocation(r.nextInt(width - appwin.w), r.nextInt(height - appwin.h));
        appwin.setVisible(true);
    }
}

class MyFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    BufferedImage img;
    int w, h;
    
    public MyFrame() {

        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                System.exit(0);
            }
        });
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        try {
            File imageFile = new File("img.jpg");
            BufferedImage imgB = ImageIO.read(imageFile);
            
            int maxSize = 500;
            
            double scaleFactor = Math.min(
                (double)maxSize / imgB.getWidth(),
                (double)maxSize / imgB.getHeight()
            );
            
            w = (int)(imgB.getWidth() * scaleFactor);
            h = (int)(imgB.getHeight() * scaleFactor);
            
            img = highQualityResize(imgB, w, h);
            
            setPreferredSize(new Dimension(w, h));
            pack();
        } catch (IOException exc) {
            exc.printStackTrace();
            System.exit(1);
        }
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        if (img != null) {

            Insets insets = getInsets();
            g.drawImage(img, insets.left, insets.top, w, h, this);
        }
    }
    
    public static BufferedImage highQualityResize(BufferedImage src, int w, int h) {
        BufferedImage resized = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = resized.createGraphics();
        
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                           RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
                           RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                           RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, 
                           RenderingHints.VALUE_COLOR_RENDER_QUALITY);
        
        g2d.drawImage(src, 0, 0, w, h, null);
        g2d.dispose();
        return resized;
    }
}

我还尝试过用Thumbnailator和imgscalr这两个专门的图片处理库来做缩放,但画质劣化的问题依然存在。

原图:
原始图片

处理后得到的图片:
缩放后的图片

对了,我是在Eclipse里开发这个程序的,创建项目时指定了“JavaSE-10”作为执行环境JRE,会不会是JRE版本的问题导致的这个情况?

备注:内容来源于stack exchange,提问作者Andrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:13:12