2010-07-22 30 views
2

我有一個非常高的像素(像1100像素高),並不是特別寬(可能是200-300像素)的BufferedImage。圖像由一個數據圖組成,但大多數像素代表一個背景顏色/值,這並不是很有趣。我的問題是,當圖像從1100像素的高度調整到200-300像素的大小時,許多實際包含有趣數據的像素被背景顏色像素丟棄。有什麼方法可以告訴Java 2D重縮放算法:在重新縮放時,我更喜歡某些值的像素(或更好的說,我想對背景顏色進行優先級排序)?我用下面的代碼片段重新調整圖像:如何在調整高BufferedImage大小時保持/支持某些像素值?

BufferedImage resized = new BufferedImage(width, height, imageType); 
Graphics2D graphics2D = resized.createGraphics(); 
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); //Has worked best in my case 
graphics2D.drawImage(source, 0, 0, width, height, null); 
graphics2D.dispose(); 

我敢肯定,有在Java中調整圖像大小的更有效的方法,但是這並不有趣(至少不是現在)。

一種令人厭煩的事情是我之前使用過一個庫(它不再使用),它實際上設法保留了大量代表像素的寶貴數據。

請注意,如果有任何幫助,我手邊有一個原始像素數據(一個2D int數組)。該應用程序將處理不同大小的許多圖像,所以我不知道高度必須是1100像素。

謝謝。

+0

您不能先裁剪圖像以除去無聊的比特? – willcodejavaforfood 2010-07-22 12:14:07

+0

好主意,但這會混淆定義爲米的軸範圍。此外,圖像會有所不同,所以我知道在頂部/底部也可能有寶貴的像素。 – 2010-07-22 12:17:36

+0

我不確定這個問題,但是不能減少背景像素的alpha值,以便在插值時減少它們的數量嗎? – 2010-07-22 12:44:38

回答

2

您是否嘗試在渲染提示中打開消除鋸齒?這可能有幫助。

如果不是,您可以很容易地編寫自己的縮放功能。這其實是很簡單 - 你只需要:

  • 循環遍歷你的目標BufferedImage中
  • 對於您的原始像素數據每個循環在相關點(所有點,這將是一個矩形區域通過您的縮放因子確定)
  • 使用基於所述原始像素所選的式值
  • 使用BufferedImage.setRGB(...)來設置目標像素的顏色計算目標顏色

正常的抗鋸齒將使用類似於源像素值的平均值的公式作爲公式,這聽起來像您想要某些優先於特定值的東西(例如,如果背景像素的顏色值較低,則取最大像素值)

+0

我想我會嘗試。謝謝! – 2010-07-22 12:32:59

相關問題