まずは絵を描いて、絵を使って練習しましょう
前者の指紋が下の署名を覆い、後者の指紋が署名の上に指紋を押し付けたような効果が得られることは明らかです。
注:Android7.0でのテスト効果は良くありません
目次
3. setPixel を使用して指紋テクスチャの色を変更します
序文
プロジェクトの新しい要件は、入力に使用された情報に基づいてバックエンドでドキュメントを生成し、情報を入力した後に端末で署名して指紋を収集することです。この要件を達成するには、指紋が以前の名前を覆う必要があります。署名と指紋押捺の効果。
すごく簡単に考えてください!、2枚の写真が重なっているだけではないでしょうか?
ただし、指紋抽出の画像は背景が白くなっているため、透明に変更する必要があります。指紋のパターンはまだ黒のままで、赤に変更する必要があり、しばらく難しいので、百度でいろいろ検索しました。
1. ビットマップとは何ですか?
ビットマップ( Bitmap ) は、ラスター グラフィックス(英語: Raster graphics ) またはビットマップとも呼ばれ、ピクセル配列(ピクセル配列/ドット マトリックス格子) で表される画像です。
主に、ピクセルの操作に使用される setPixel(int x, int y, int color) メソッドを使用します。これら 3 つのパラメータの意味 x – 置換されるピクセルの x 座標; y – 置換されるピクセルの y 座標; color – ビットマップに書き込まれる ARGB カラー
2. 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
}
3. 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 メソッドが使用されます。