2015-11-02 92 views
1

我有一種方法會使用彩色濾鏡將效果添加到位圖。例如:對位圖使用5x5色彩矩陣

public static Bitmap changeContrast(Bitmap bmp, float contrast) 
{ 
    ColorMatrix cm = new ColorMatrix(new float[] 
      { 
        contrast, 0, 0, 0, 0, 
        0, contrast, 0, 0, 0, 
        0, 0, contrast, 0, 0, 
        0, 0, 0, 1, 0 
      }); 

    return getBitmapFromColorMatrix(cm, bmp); 
} 

不過,我想用一個銳化濾波器矩陣:

0 0 0 0 0 
0 -1 -1 -1 0 
0 -1 9 -1 0 
0 -1 -1 -1 0 
0 0 0 0 0 

但嘉洛斯只接受4x5的矩陣陣列。有沒有一種方法可以在我的位圖中使用5x5矩陣?

我試了一下:

我嘗試使用ScriptIntrinsicConvolve5x5類,但它需要API17及以上,但我需要使用API​​下來API14。我怎樣才能做到這一點。請幫忙。

UPDATE:

這是getBitmapFromColorMatrix(代碼),這可能是有幫助的。

static Bitmap getBitmapFromColorMatrix (ColorMatrix cm, Bitmap sourceBitmap) { 
     Bitmap ret = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight(), sourceBitmap.getConfig()); 

     Canvas canvas = new Canvas(ret); 

     Paint paint = new Paint(); 
     paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
     canvas.drawBitmap(sourceBitmap, 0, 0, paint); 

     return ret; 
    } 

回答

0

這個問題是舊的,但如果你還有興趣,正如你提到的,ColorMatrix使用一個4x5矩陣,主要是因爲沒有使用第5行。 ScriptIntrinsicConvolve5x5不是你要找的。正如https://stackoverflow.com/a/27454681/852795所述,「Convolve5x5是一個根本不同的操作,它不支持每個通道的不同常量.ColorMatrix實際上是您想要的操作,應該是快速的。」看看你的「銳化濾波器矩陣」,你的最後一行全是0,所以你應該可以忽略它。嘗試刪除,並抽4x5矩陣看看是否有效。

public static Bitmap sharpeningFilter(Bitmap bmp) 
{ 
    ColorMatrix cm = new ColorMatrix(new float[] 
      { 
        0, 0, 0, 0, 0, 
        0, -1, -1, -1, 0, 
        0, -1, 9, -1, 0, 
        0, -1, -1, -1, 0 
      }); 

    return getBitmapFromColorMatrix(cm, bmp); 
} 

順便說一句,如果你希望進一步提高,並在同一時間的對比,就可以使用ColorMatrixColorFilter(cm);然後Paint.setColorFilter()之前連接具有cm.postConcat(new ColorMatrix(mat));的ColorMatrices。

最後,檢查出https://stackoverflow.com/a/15119089/852795爲一個偉大的ColorMatix resouce的亮度,對比度,飽和度和色相。你會注意到@Pablo使用5x5矩陣,但第5行始終是0, 0, 0, 0, 1,因此無關緊要,因爲它無論如何都被忽略。