使用位图的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

但ColorMatrix只接受4x5矩阵数组。有没有一种方法可以将5x5矩阵与位图一起使用?

我尝试过的:

我尝试使用ScriptIntrinsicConvolve5x5类,但它需要API17及更高版本,但我需要使用API14以下的api。我怎样才能做到这一点。请帮忙。

更新:

这是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;
   }

这个问题很老,但如果您仍然感兴趣,正如您所指出的,ColorMatrix使用了4x5矩阵,主要是因为没有使用第5行。ScriptIntrinsicConvolve5x5不是您想要的。如https://stackoverflow.com/a/27454681/852795,"Convolve5x5是一个根本不同的操作,不支持每个通道不同的常量。ColorMatrix确实是你想要的操作,应该很快。"

看看你的"锐化滤波器矩阵",你的最下面一行都是零,所以你应该可以忽略它。试着去掉它,然后输入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()之前将ColorMatrix与cm.postConcat(new ColorMatrix(mat));连接起来。

最后,查看https://stackoverflow.com/a/15119089/852795在亮度、对比度、饱和度和色调方面具有出色的ColorMatix资源。您会注意到@Pablo使用5x5矩阵,但第5行始终是0, 0, 0, 0, 1,因此不相关,这很好,因为它无论如何都被忽略了。

最新更新