有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将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;
    } 

共 (3) 个答案

  1. # 1 楼答案

    如果您使用的是Java 5或更新版本,您可以尝试渲染提示。插值提示的值\插值\双三次

    本文非常详细地描述了Java2D的不同缩放行为:perils-of-getScaledInstance

    它包含使用Java中可用的不同方法可以看到的不同缩尺结果的示例

    它还提供了示例代码,使用多步aproach来缩小图像的比例,这似乎比值插值双线性产生了更好的结果

  2. # 2 楼答案

    覆盖将显示图像和查看图形的任何组件的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);
    
  3. # 3 楼答案

    我会摆脱这个:

    int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB :     image.getType();
    

    并始终使用BufferedImage.TYPE_INT_ARGB

    这似乎给了我很好的结果