为位图使用 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 位图颜色为透明

WinAPI/GDI:如何使用 GetDIBits() 为位图合成颜色表?

Android位图曝光

使用位图色彩乘法时如何获得所需的颜色?