2011-02-02 40 views
1

我试图显示比JFrame尺寸更大的图像。如果我尝试调整图像的大小,那么图像质量会丢失。将Java图像合并到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; 
    } 
+0

你是如何重新调整大小的?如果你不把它做得更小,如何将图像放入更小的盒子中? – 2011-02-02 21:44:16

+1

如何缩小图像而不缩小图像?裁剪? – I82Much 2011-02-02 21:44:28

+0

我看到你编辑了你的问题,但你还没有告诉我们你是如何缩小图像的,所以我不知道如何通过猜测来提供答案。 – 2011-02-02 22:01:04

回答

2

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

还有的Java2D的不同的缩放行为的这篇文章中有很详细的描述:perils-of-getScaledInstance

它包含了不同低档次的例子的结果,你可以期望看到在Java中可用的不同方法。

它还提供了示例代码,它使用多步骤的方法缩小比VALUE_INTERPOLATION_BILINEAR好得多的图像。

1

重写任何组分的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); 
0

我想摆脱这样的:

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

而且总是用BufferedImage.TYPE_INT_ARGB

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