2016-12-31 170 views
0

我找不到我的問題的任何解決方案,希望你能幫助我。我有一個緩衝圖像(例如img),並且我想調整它(使用其像素數組)以恰好適合100px(100 x 100)。我發現的所有解決方案都是爲了在繪圖時「拉伸」圖像,但我真的需要這個數組。 我想到了一個算法,這嘗試之一:BufferedImage的大小調整算法

BufferedImage resized = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB); 
     for(int i = 0; i < img.getWidth(); i++){ 
      for(int j = 0; j < img.getHeight(); j++){ 
       resized.setRGB(i*(100/img.getWidth()), j*(100/img.getHeight()), img.getRGB(i, j)); 
      } 
     } 

我無法解釋它(當然,不是英文)它做什麼,但我想你可以很容易地看到它(在原始圖像中的每個像素( IMG),把它放在新的BufferedImage(調整)在postition(老位置*調整因素)。(希望這是一個很好的說明)。 但是但是,它不工作,我只得到零:( 有人能告訴我要修改什麼,或給我一個算法的其他例子?(不管它有多快,只要我能理解它)

(我真的希望它不是轉發,因爲我真的不能f IND另一個問題/解決方案,目的是在陣列調整:/)

問候:)

+1

我不是在圖像方面的專家,但我認爲你會對此有所倒退。試着將'i'和'j'在從0到100的'resized'索引上迭代。然後使用縮放因子將'resize [i] [j]'設置爲'img'中的一個像素。 –

+0

這個問題是否重複? http://stackoverflow.com/questions/9417356/bufferedimage-resize –

+0

即使你「真的需要數組」(我不明白爲什麼,從你的代碼中),它會*更快*只是使用' AffineTransformOp'並使用'TYPE_NEAREST_NEIGHBOR'向下採樣圖像。如果需要,您仍然可以從生成的圖像中獲取支持數組。 – haraldK

回答

1

讓我們來看看您的問題僅在一個維度。對於寬度的原始圖像中的每一列iowidth您要查找的列ii在寬度nwidth的新形象,你的情況100。您計算ii這樣的:

ii = i * (nwidth/owidth); 

的公式在原則上是好的,但括號確保首先計算配給nwidth/owidth。因爲你縮小比例,這個比例小於1。因爲無論nwidthowidth是整數,該師是一個整數除法,其結果也必須是整數。在這裏,它是零。

您可以通過兩種方式解決這個問題:使部門的浮點除法:

ii = i * (1.0 * nwidth/owidth); 

或只是刪除括號,這樣乘法首先發生:

ii = i * nwidth/owidth; 

(有,溢出的危險時,你的圖像是非常大的,但在你的情況,這不應該是一個問題)

最後,詹姆斯·諾克斯·波爾克是正確的:你有邏輯錯誤的方式圓鋼d。使用for循環訪問新圖像的每個像素,並從舊圖像中爲新圖像中的每個像素選取一個源像素。 (這也意味着比率是相反的。)

即邏輯爲兩個縮放上下AME:必須選擇每個目標像素的源極的像素。放大時,最終會多次使用相同的源像素;縮小時,可以跳過一些源像素。這是一種快速且直接的(但不是高質量的)縮放算法。

+0

非常感謝你!真的幫助我:) – Mechamod

相關問題