我有一个方法可以使用滤镜为位图添加效果。例如:
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及更高版本,但我需要使用api到API14。我怎样才能做到这一点。请帮忙。
更新:
这是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 :(得分:2)
这个问题已经过时了,但是如果您仍然感兴趣,正如您所指出的,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);
}
顺便说一下,如果你想同时锐化和对比,你可以在使用cm.postConcat(new ColorMatrix(mat));
然后ColorMatrixColorFilter(cm);
之前将ColorMatrices与Paint.setColorFilter()
连接起来。
最后,请查看https://stackoverflow.com/a/15119089/852795,了解亮度,对比度,饱和度和色调的ColorMatix
资源。您会注意到@Pablo使用5x5矩阵,但第5行始终为0, 0, 0, 0, 1
,因此无关紧要,因为它无论如何都会被忽略。