2010-07-30 108 views
45

我是這個網站的新手,我帶着一個關於Android的問題。在Android中將位圖轉換爲GrayScale

有什麼辦法將位圖轉換爲灰度?我知道如何繪製灰度位圖(使用畫布操作:http://www.mail-archive.com/[email protected]/msg38890.html),但我確實需要灰色的實際位圖(或者至少可以稍後轉換爲位圖的位圖)。 我是否必須手動實現它(逐個像素的操作)?

我搜索了很多,但仍找不到。任何人都知道一種簡單/有效的方式來做到這一點

非常感謝!

+1

參照此問題#1:http://stackoverflow.com/questions/1793338/drawable-grayscale – 2010-07-31 05:58:24

+0

所以轉換後它以黑白將圖像尺寸縮小? (以kb爲單位) – 2014-06-21 07:04:43

回答

15

這不正是你鏈接到的代碼是幹什麼的?它需要一個彩色位圖(「bmp」),創建一個重複的位圖(「bm」),然後使用濾鏡將該顏色位圖繪製到「bm」中以將其轉換爲灰度。從這一點開始,您可以使用「bm」作爲實際的灰度位圖,並執行您想要的任何操作。你需要稍微調整一下樣本(它使用硬編碼的大小,你可能想要克隆原始位圖的大小),但除此之外,這似乎是即時可用的,視使用情況而定,取決於你想要的東西。

133

哦,是的,它的確如此。 我錯誤地使用了它,謝謝指出它給我。 (很抱歉的無用的問題) 下面是結束代碼(主要基於一個鏈接),因爲它可以幫助別人:

public Bitmap toGrayscale(Bitmap bmpOriginal) 
{   
    int width, height; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth();  

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(bmpGrayscale); 
    Paint paint = new Paint(); 
    ColorMatrix cm = new ColorMatrix(); 
    cm.setSaturation(0); 
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
    paint.setColorFilter(f); 
    c.drawBitmap(bmpOriginal, 0, 0, paint); 
    return bmpGrayscale; 
} 

任何言論或評論它是非常歡迎的。

謝謝

+1

這並不保留完整的8位灰度,它將其剪輯爲5或6位,並且每像素消耗16位而不是8位。差異可能不是非常明顯,但檢出梯度以查看最壞的情況。 – 2012-08-10 02:49:42

+14

必須說,使用RGB_565會使全透明區域變成黑色。在這種情況下,請使用Bitmap.Config.ARGB_8888在灰度圖像上保持透明度。 – IronBlossom 2013-07-09 08:13:01

+0

所以在將它轉換成黑白圖像後,圖像尺寸會減小嗎? (以kb爲單位) – 2014-06-21 07:04:10

12

我想提一下,用這種方法必須考慮一個重要方面。 Android上的BitMap存儲在NativeHeap中。通過「創建位圖」,最終會阻塞內存,獲得OutOfMemoryException(OOM)。

因此,位圖必須始終爲.recycled()

+8

你能提供一個參考嗎? API文檔[state](http://developer.android.com/reference/android/graphics/Bitmap。html#recycle()):「[recycle]是一個高級調用,通常不需要調用,因爲當沒有更多的引用時,普通的GC進程將釋放這個內存。」 – Tamlyn 2011-11-02 12:53:18

+1

只有Java對象是GC'd時,GC纔會調用recycle()。但是,當虛擬機內存不足時調用GC,而不是響應本機堆上的內存可用性。所以,如果你沒有做過那麼多的圖像工作,如果你可能沒有回收利用。但是,如果你做了很多事,如果你沒有回收利用,你很快就會遇到麻煩。 – tomwhipple 2012-07-11 23:32:52

11

如果您要在ImageView上顯示該位圖。然後,而不是轉換位圖灰度,你可以試試下面的代碼:

ColorMatrix matrix = new ColorMatrix(); 
matrix.setSaturation(0); 

ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
imageview.setColorFilter(filter); 

For reference

+2

這種方法是表演的敵人。我嘗試過這個。 – 2016-01-15 14:42:51