2010-12-15 150 views
4

在Android(1.5)工作,我有一百個左右的字節數組形式的灰度圖像。我想使用圖像作爲alpha遮罩在Canvas中繪製純色。圖像是固定的,但顏色可以改變。我可以爲每個圖像/顏色組合創建位圖對象,但這看起來非常低效。從內存和速度兩方面來看,解決這個問題的好方法是什麼? (我需要爲每個圖像/顏色組合做了很多次。)如何alpha遮罩顏色

回答

4

我想我發現我一直在尋找的答案:

  1. 創建ARGB_8888位圖,其中每個像素的顏色設置爲(灰色< < 24)| 0XFFFFFF。
  2. 對於每種顏色,創建一個新的PorterDuffColorFilter(color,PorterDuff.Mode.MULTIPLY)。
  3. 要進行渲染,請創建一個Paint對象,並使用與要使用的顏色對應的濾鏡調用setColorFilter()。然後使用Bitmap和Paint對象調用canvas.drawBitmap。

對於單一顏色,這可能不像構建我想要的位圖和繪製沒有Paint對象那樣快,但它比每個圖像/顏色組合的位圖更具空間效率。

0

我會用drawImage的圖像BitBlt到畫布,getImageData()訪問像素,然後在圖像數據的.data環,設置將每個像素的RGB值轉換爲您的常量,並將第四個(alpha)值與您從圖像中獲得的值進行比較。然後你可以將這個半透明的畫布鋪在你需要的任何地方。

編輯:我已將a working example這個放在我的網站上。只適用於Chrome/Safari。

+0

我正在做這樣的事情。這個問題(我看到我沒有完全解釋)是我需要一個解決方案,每個圖像可以緩存和重複使用很多次。每次需要時我都無法重新生成圖像,我無法將圖像緩存到所需的每種顏色中。 – 2010-12-16 21:02:53

+0

@TedHopp我很高興你有一個解決方案。但是,我上面的解決方案可以緩存圖像數據,而不會緩存每種顏色的變化。請注意,圖像數據只加載一次(window.onload'中的第115行),而每更新一次滑塊(作爲'updateColor()'的一部分),則重新創建每種顏色的變化。 – Phrogz 2010-12-16 21:13:08

+0

我試圖避免的是爲每個顏色變化生成一個新圖像。 Porter-Duff濾色器似乎就是這樣做的。 – 2011-01-13 00:08:37

1

float contrast = 100/180.f; float scale = contrast + 1.f;

 cm.set(new float[] { 
       scale, 0, 0, 0, 0,//Red 
       0, 1.5f, 0, 0, 0,//Green 
       0, 0, 1.5f, 0, 0,//Blue 
       0, 0, 0, 1, 0 });//alpha 
     bmpGrayscale = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565); 

     Canvas c = new Canvas(bmpGrayscale); 
     Paint paint = new Paint(); 

     ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
     paint.setColorFilter(f); 
     c.drawBitmap(bitmap, 0, 0, paint); 
     /*BitmapDrawable bmd = new BitmapDrawable(bmpGrayscale); 
     photo_view.setBackgroundDrawable(bmd);*/ 

     photo_view.setImageBitmap(bmpGrayscale);