2011-02-02 60 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

這似乎給了我很好的效果。