为位图使用 5x5 颜色矩阵
Posted
技术标签:
【中文标题】为位图使用 5x5 颜色矩阵【英文标题】:Using 5x5 Color Matrix for Bitmap 【发布时间】:2015-11-02 09:27:48 【问题描述】:我有一种方法可以使用颜色过滤器为位图添加效果。例如:
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;
【问题讨论】:
【参考方案1】:这个问题很老了,但如果您仍然感兴趣,正如您所指出的,ColorMatrix 使用 4x5 矩阵,主要是因为第 5 行没有使用。 ScriptIntrinsicConvolve5x5 不是您要找的。正如https://***.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);
之前将ColorMatrices与cm.postConcat(new ColorMatrix(mat));
连接起来,然后再使用Paint.setColorFilter()
。
最后,请查看 https://***.com/a/15119089/852795 以获取有关亮度、对比度、饱和度和色调的出色 ColorMatix
资源。您会注意到 @Pablo 使用 5x5 矩阵,但第 5 行始终是 0, 0, 0, 0, 1
,因此无关紧要,因为它无论如何都会被忽略。
【讨论】:
以上是关于为位图使用 5x5 颜色矩阵的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .NET 中使用 ColorMatrix 更改亮度、颜色、饱和度、色调
如何在 SkiaSharp 中使 SKBitmap 位图颜色为透明