将Java映像适配到JFrame中
我试图显示一个比JFrame尺寸更大的图像。如果我尝试将图像调整得更小,则图像质量将丢失 如果我将图像放大,质量不会丢失。这在Java映像包中是正常行为吗 我想我想弄清楚的是,在缩小图像尺寸时,我可能做错了什么。那么Java是否提供了一种在不降低图像质量的情况下自动执行此操作的方法 与JButtons相同的行为,其中java自动调整JPanel中JButton所占用的空间将Java映像适配到JFrame中,java,image,swing,applet,Java,Image,Swing,Applet,我试图显示一个比JFrame尺寸更大的图像。如果我尝试将图像调整得更小,则图像质量将丢失 如果我将图像放大,质量不会丢失。这在Java映像包中是正常行为吗 我想我想弄清楚的是,在缩小图像尺寸时,我可能做错了什么。那么Java是否提供了一种在不降低图像质量的情况下自动执行此操作的方法 与JButtons相同的行为,其中java自动调整JPanel中JButton所占用的空间 bufferedImage = resize(bufImage,500,600); ImageIcon
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;
}
覆盖将显示图像和查看图形的任何组件的
paintComponent(Graphics g)
方法。()
您甚至可以将您的图形
实例转换为一个实例,以获得更多功能。例如()
我会摆脱这个:
int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
并始终使用BufferedImage.TYPE\u INT\u ARGB
这似乎给了我很好的结果。如果您使用的是Java 5或更新版本,您可以尝试RenderingHints.VALUE\u INTERPOLATION\u BICUBIC作为插值提示 本文非常详细地描述了Java2D的不同缩放行为: 它包含使用Java中可用的不同方法可以看到的不同缩尺结果的示例
它还提供了示例代码,使用多步aproach来缩小图像的大小,这似乎比值插值双线性产生了更好的结果。您如何尝试重新调整图像大小?如果你不把一个图像缩小,它怎么能放进一个更小的盒子里呢?你怎么能把一个图像缩小而不缩小呢?裁剪?我知道你已经编辑了你的问题,但你仍然没有告诉我们你是如何缩小图像的,所以我不知道除了猜测之外,我们如何才能提供答案。但最好不要使用绘画,也不要直接在JFrame中这样做。最好使用JFrame持有的JComponent的paintComponent方法进行绘制,通常是表示JFrame的contentPane的JPanel。因此,我说要覆盖任何组件的方法,我都不会建议直接在JFrame或JDialog()上绘制。在这种情况下,您能将paint()更改为paintComponent()吗?它在第一句中。我通常使用JPanel作为虚拟可绘制组件。。但我会在我的回答中做出更正:)谢谢,链接中的算法在缩小图像时确实提供了很好的结果。这就解决了我的问题。我只是想说,在我的例子中,每次我以任何方式修改图像(收缩、调整大小等),质量都会在非常小的程度上恶化。在多次修改图像后注意到这一点。所以我只是在内存中保留了图像的原始副本,并使用了它。
int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();