[英]Fit Java Image into JFrame
我正在尝试显示大于JFrame尺寸的图像。 如果我尝试缩小图像的尺寸,则会失去图像质量。
如果我放大图像,则画质不会丢失。 这是Java映像包中的正常行为吗?
我想我要弄清楚的是缩小图像大小时可能做错了什么。 那么Java是否提供了一种在不降低图像质量的情况下自动执行此操作的方法?
行为与JButton相同,在Java中Java自动调整JPanel中JButton占用的空间。
bufferedImage = resize(bufImage,500,600);
ImageIcon imageIcon = new ImageIcon(bufferedImage);
resizedIMage = imageIcon.getImage();
实际的调整大小如下。 我从互联网上拿走的。
private static BufferedImage resize(BufferedImage image, int width, int height) {
int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
BufferedImage resizedImage = new BufferedImage(width, height, type);
Graphics2D g = resizedImage.createGraphics();
g.setComposite(AlphaComposite.Src);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(image, 0, 0, width, height, null);
g.dispose();
return resizedImage;
}
如果您使用的是Java 5或更高版本,则可以尝试使用RenderingHints.VALUE_INTERPOLATION_BICUBIC作为插值提示。
本文对Java2D的不同缩放行为进行了非常详细的描述: perils-of-getScaledInstance
它包含使用Java中可用的不同方法可以看到的不同缩减结果的示例。
它还提供了示例代码,该示例代码使用多步方法缩小了图像的比例,看起来比VALUE_INTERPOLATION_BILINEAR产生更好的结果。
重写任何将显示图像并查看Graphics的组件的paintComponent(Graphics g)
方法。 drawImage ()
您甚至可以将Graphics
实例转换为Graphics2D以获得更多功能。 例如setRenderingHings ()
Graphics2D g2 = (Graphics2D) g;
RenderingHints rh = g2.getRenderingHints ();
rh.put (RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHints (rh);
我会摆脱这个:
int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
并始终使用BufferedImage.TYPE_INT_ARGB
那似乎给了我很好的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.