【问题标题】:Fit Java Image into JFrame使 Java 图像适合 JFrame
【发布时间】:2011-06-20 07:03:22
【问题描述】:

我正在尝试显示大于 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;
    } 

【问题讨论】:

  • 你想如何调整它的大小?如果你不把它缩小,图片怎么能装进一个更小的盒子里?
  • 如何在不缩小图像的情况下缩小图像?裁剪它?
  • 我看到你已经编辑了你的问题,但你仍然没有告诉我们你是如何缩小你的图像的,所以我不知道除了猜测之外我们如何提供答案。

标签: java image swing applet


【解决方案1】:

覆盖将显示图像的任何组件的paintComponent(Graphics g) 方法并查看Graphics.drawImage()

您甚至可以将您的 Graphics 实例转换为 Graphics2D 以获得更多功能。例如setRenderingHings()

Graphics2D g2 = (Graphics2D) g;
RenderingHints rh = g2.getRenderingHints ();
rh.put (RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHints (rh);

【讨论】:

  • 但最好不要直接在 JFrame 中使用绘画,也不要直接这样做。最好在 JFrame 持有的 JComponent 的 paintComponent 方法中进行绘制,通常是表示 JFrame 的 contentPane 的 JPanel。
  • 因此我说要覆盖任何组件的方法
  • 我绝不建议直接在 JFrame 或 JDialog 上绘图 :)
  • 这样的话,能不能把paint()改成paintComponent()?它在第 1 句中。
  • 我通常使用 JPanel 作为虚拟可绘制组件。但我会在我的回答中进行更正:)
【解决方案2】:

我会摆脱这个:

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

并且始终使用BufferedImage.TYPE_INT_ARGB

这似乎给了我很好的结果。

【讨论】:

    【解决方案3】:

    如果您使用的是 Java 5 或更新版本,您可以尝试使用 RenderingHints.VALUE_INTERPOLATION_BICUBIC 作为插值提示。

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

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

    它还提供了示例代码,该示例代码使用多步方法来缩小图像,这似乎比 VALUE_INTERPOLATION_BILINEAR 产生更好的结果。

    【讨论】:

    • 感谢该链接中的算法在缩小图像时实际上提供了良好的结果。这解决了我的问题。
    • 只是想说,就我而言,每次我以任何方式(缩小、调整大小等)修改图像时,质量都会有很小的下降。多次修改图像后注意到这一点。所以我只是在内存中保留了图像的原始副本并使用了那个。
    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 2015-03-26
    • 2011-04-02
    • 2013-05-25
    • 2021-04-08
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多