Bitmap 处理图片修改为透明背景,改变主颜色

先上图,有图有实践

很明显前一个指纹把下面的签名遮挡住,后一个达到了签名按指纹的效果

:在Android7.0上面测试效果不佳

目录

前言

一、Bitmap是什么?

二、使用setPixel 修改指纹背景颜色

三、使用setPixel 修改指纹纹路颜色

总结


前言

       项目新需求在后端根据用于填写的信息要生成文档,再填写完信息后会在终端上进行签名和收集指纹,并且指纹还需要覆盖到前的名字上面,达到签字按手印的效果。

        一想SO easy!,不就是两个图片重叠起来不就可以了么。

        但是指纹提取的图片是存白色的背景,需要改成透明的。指纹纹路还是黑色的,需要改成红色的,一时难住了,于是乎各种百度各种搜。  

一、Bitmap是什么?

       位图Bitmap),又称栅格图(英语:Raster graphics)或点阵图,是使用像素阵列(Pixel-array/Dot-matrix点阵)来表示的图像

       其主要使用到了setPixel(int x,int y,int color)方法,这个方法是用来操作像素点的。其中这三个的参数含义x–要替换的像素的x坐标; y–要替换 的像素的y坐标;color–要写入位图的ARGB颜色

二、使用setPixel 修改指纹背景颜色

建议:适用于纯色背景颜色

代码示例如下:

 /**
     * TODO 建议:适用于纯色背景颜色
     * 改变背景颜色
     * @param oldBitmap 原bm
     * @param config 配置的参数 如果修改后的背景还是有点瑕疵  可以尝试更改config值:ALPHA_8, RGB_565, ARGB_4444, ARGB_8888, RGBA_F16, HARDWARE
     * @param oldColor 需要替换的背景色
     */
    fun replaceBitmapColor(
        oldBitmap: Bitmap,
        config: Bitmap.Config = Bitmap.Config.ARGB_4444,
        oldColor: Int = Color.WHITE,
        newColor: Int = Color.TRANSPARENT
    ): Bitmap? {
        if (null == oldBitmap) return null
        val mBitmap = oldBitmap.copy(config, true)
//循环获得bitmap所有像素点
        val mBitmapWidth = mBitmap.width
        val mBitmapHeight = mBitmap.height
        for (i in 0 until mBitmapHeight) {
            for (j in 0 until mBitmapWidth) {
//获得Bitmap 图片中每一个点的color颜色值
//将需要填充的颜色值如果不是
//在这说明一下 如果color 是全透明 或者全黑 返回值为 0
//getPixel()不带透明通道 getPixel32()才带透明部分 以全透明是0x00000000
//而不透明黑色是0xFF000000 如果不计算透明部分就都是0了
                val color = mBitmap.getPixel(j, i)
                if (color == oldColor) {
                    mBitmap.setPixel(j, i, newColor) //将白色替换成透明色
                }
            }
        }
        oldBitmap.recycle()

        return mBitmap
    }

三、使用setPixel 修改指纹纹路颜色


    /**
     * 修改颜色
     */
    fun dealBackground(bm: Bitmap): Bitmap {
        for (i in 0 until bm.width) {
            for (j in 0 until bm.height) {
                val color = bm.getPixel(i, j)
//                获取像素点的RGB颜色值
                val R: Int = Color.red(color) ?: 0
                val G: Int = Color.green(color) ?: 0
                val B: Int = Color.blue(color) ?: 0
                "图片处理----$R--$G---$B".loge()
//                将接近白色的背景替换成为白色的背景,用于之后处理透明
//                将不是白色的背景替换为红色也就是指纹的纹路
                if (R > 240 && G > 240 && B > 240) {
                    val newColor: Int = Color.argb(0, 255, 255, 255)
                    bm.setPixel(i, j, newColor)
                } else {
                    val newColor: Int = Color.argb(0, 255, 0, 0)
                    bm.setPixel(i, j, newColor)
                }
            }
        }
        return bm
    }

完整代码


import android.graphics.Bitmap
import android.graphics.Color
import me.hgj.jetpackmvvm.ext.util.loge

/**
 * 改变颜色值、改变背景透明度
 */
object BitmapUtils {

    /**
     * TODO 建议:适用于纯色背景颜色
     * 改变背景颜色
     * @param oldBitmap 原bm
     * @param config 配置的参数 如果修改后的背景还是有点瑕疵  可以尝试更改config值:ALPHA_8, RGB_565, ARGB_4444, ARGB_8888, RGBA_F16, HARDWARE
     * @param oldColor 需要替换的背景色
     */
    fun replaceBitmapColor(
        oldBitmap: Bitmap,
        config: Bitmap.Config = Bitmap.Config.ARGB_4444,
        oldColor: Int = Color.WHITE,
        newColor: Int = Color.TRANSPARENT
    ): Bitmap? {
        if (null == oldBitmap) return null
        val mBitmap = oldBitmap.copy(config, true)
//循环获得bitmap所有像素点
        val mBitmapWidth = mBitmap.width
        val mBitmapHeight = mBitmap.height
        for (i in 0 until mBitmapHeight) {
            for (j in 0 until mBitmapWidth) {
//获得Bitmap 图片中每一个点的color颜色值
//将需要填充的颜色值如果不是
//在这说明一下 如果color 是全透明 或者全黑 返回值为 0
//getPixel()不带透明通道 getPixel32()才带透明部分 以全透明是0x00000000
//而不透明黑色是0xFF000000 如果不计算透明部分就都是0了
                val color = mBitmap.getPixel(j, i)
                if (color == oldColor) {
                    mBitmap.setPixel(j, i, newColor) //将白色替换成透明色
                }
            }
        }
        oldBitmap.recycle()

        return mBitmap
    }

    /**
     * 修改颜色
     */
    fun dealBackground(bm: Bitmap): Bitmap {
        for (i in 0 until bm.width) {
            for (j in 0 until bm.height) {
                val color = bm.getPixel(i, j)
//                获取像素点的RGB颜色值
                val R: Int = Color.red(color) ?: 0
                val G: Int = Color.green(color) ?: 0
                val B: Int = Color.blue(color) ?: 0
                "图片处理----$R--$G---$B".loge()
//                将接近白色的背景替换成为白色的背景,用于之后处理透明
//                将不是白色的背景替换为红色也就是指纹的纹路
                if (R > 240 && G > 240 && B > 240) {
                    val newColor: Int = Color.argb(0, 255, 255, 255)
                    bm.setPixel(i, j, newColor)
                } else {
                    val newColor: Int = Color.argb(0, 255, 0, 0)
                    bm.setPixel(i, j, newColor)
                }
            }
        }
        return bm
    } 
}


总结

 Bitmap未发现的方法还有很多,具体主要使用到了setPixel方法。

猜你喜欢

转载自blog.csdn.net/weixin_41620505/article/details/129253874
今日推荐