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
相关产品推荐
相关产品推荐

