2013-03-08 72 views
4

我在清理縮小Android上的圖像時遇到了問題。我正在尋找在原始大小的10-100%的任意大小之間縮放小PNG圖像。在Android中完全縮小圖像:可以完成嗎?

我創建了一個樣本圖像來演示這個問題,並加劇我看到在Android的圖像縮放器的異常行爲:

NOTE: you will want to right-click on the image and view it directly...this page may downscale the image again 上面的影像是來自Android設備的屏幕截圖一些註釋添加。我還在左側的第二列中添加了相同的圖像,顯​​示瞭如何使用「The GIMP」(GNU圖像操作程序)進行線性縮放來渲染它們。

基本圖像由紅色和藍色像素的棋盤圖案背景組成。在那個背景下,我畫了一些1px寬的黃線和相當薄的綠色文字。圖像是288x288像素。

當將圖像縮放到其原始尺寸的1/3時,Android似乎只抓取九個像素中的一個,丟棄所有其他數據。結果是一些黃線完全消失。值得注意的是,棋盤圖案保持完好(這僅僅是每個使用的第3個像素的結果)。

當將圖像縮放到其原始大小的近似但非正好50%的尺寸時(例如,142x142或143x143),縮放器會在圖像上創建一些相當大的異常/僞像。

在尺寸爲50%(144x144)時,圖像看起來正確。

測試圖像確實帶出了最糟糕的圖像縮放器,但「正常」的PNG圖標圖像也受到嚴重影響。從10-33%左右的圖像沒有適當的重新採樣,因此顯得非常「位圖」。某些較大尺寸的圖像在某些尺寸下具有非常奇怪的異常。

如果有人知道一種方法來禁用這種奇怪的縮放行爲,即使在性能成本下,我也會很高興知道這一點。它當然可以通過編寫一個直接在位圖像素上運行的算法來解決,但我希望這不是唯一的選擇。

另外值得注意的是,所有的圖像工作都是使用ARGB_8888 Bitmap.Configs完成的。我試圖通過在ImageViews上設置maxwidth/maxheight來操作圖像大小,通過使用Bitmap.createScaledBitmap(),並通過使用Bitmap.createBitmap和Matrix來操作。所有嘗試都有同樣的結果。位圖過濾已啓用。

再次感謝您的任何建議!

+0

嘿,我想你有但是...你有沒有試過創建一個你的圖像的9.png文件?據我所知,9補丁圖像用於拉伸,而不是縮小...但值得一試。 – AlejandroVK 2013-03-08 12:24:27

回答

2

與Matrix使用Bitmap.createScaledBitmap()和Bitmap.createBitmap是相同的; see the source for Bitmap.createScaledBitmap(自從Android 2以來沒有改變)。

在Android 4.0+上,使用矩陣(如Bitmap.createScaledBitmap)允許硬件加速操作(如果啓用的話)(4.1​​+ IIRC默認啓用),因此我們無法直接控制正在執行的操作,它是如何完成的。

這意味着您必須使用所需的(這裏是線性)過濾來實現您自己的縮放方法;通過像素處理;或者使用帶有良好過濾器的OpenGL ES,但它可能不適用於所有設備。