Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java映像适配到JFrame中_Java_Image_Swing_Applet - Fatal编程技术网

将Java映像适配到JFrame中

将Java映像适配到JFrame中,java,image,swing,applet,Java,Image,Swing,Applet,我试图显示一个比JFrame尺寸更大的图像。如果我尝试将图像调整得更小,则图像质量将丢失 如果我将图像放大,质量不会丢失。这在Java映像包中是正常行为吗 我想我想弄清楚的是,在缩小图像尺寸时,我可能做错了什么。那么Java是否提供了一种在不降低图像质量的情况下自动执行此操作的方法 与JButtons相同的行为,其中java自动调整JPanel中JButton所占用的空间 bufferedImage = resize(bufImage,500,600); ImageIcon

我试图显示一个比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;
    } 

覆盖将显示图像和查看图形的任何组件的
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();