我有一个方法,可以使用滤色器为位图添加效果。例如:
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
,因此不相关,这很好,因为它无论如何都被忽略了。