将Java映像适配到JFrame中
我试图显示一个比JFrame尺寸更大的图像。如果我尝试将图像调整得更小,则图像质量将丢失
如果我将图像放大,质量不会丢失。这在Java映像包中是正常行为吗
我想我想弄清楚的是,在缩小图像尺寸时,我可能做错了什么。那么Java是否提供了一种在不降低图像质量的情况下自动执行此操作的方法
与JButtons相同的行为,其中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;
}
# 1 楼答案
如果您使用的是Java 5或更新版本,您可以尝试渲染提示。插值提示的值\插值\双三次
本文非常详细地描述了Java2D的不同缩放行为:perils-of-getScaledInstance
它包含使用Java中可用的不同方法可以看到的不同缩尺结果的示例
它还提供了示例代码,使用多步aproach来缩小图像的比例,这似乎比值插值双线性产生了更好的结果
# 2 楼答案
覆盖将显示图像和查看图形的任何组件的
paintComponent(Graphics g)
方法drawImage()您甚至可以将
Graphics
实例转换为Graphics2D以获得更多功能。例如setRenderingHings()# 3 楼答案
我会摆脱这个:
并始终使用
BufferedImage.TYPE_INT_ARGB
这似乎给了我很好的结果