You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何对拍摄的Aadhaar卡图片进行卡号打码处理

Aadhaar卡图片卡号打码实现方案

一、获取拍摄后的图片文件

你已经通过File Provider实现相机拍照功能,拍摄完成后会拿到图片的Uri,先将其转换为可操作的Bitmap:

fun uriToBitmap(context: Context, uri: Uri): Bitmap? {
    return try {
        val inputStream = context.contentResolver.openInputStream(uri)
        BitmapFactory.decodeStream(inputStream)
    } catch (e: IOException) {
        e.printStackTrace()
        null
    }
}

二、打码实现方案

1. 固定区域打码(卡号位置固定场景)

如果Aadhaar卡的卡号在图片中的位置相对固定(提前测试确定坐标范围),直接在对应区域绘制黑色矩形覆盖:

fun addMaskToFixedArea(bitmap: Bitmap, maskRect: Rect): Bitmap {
    val mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
    val canvas = Canvas(mutableBitmap)
    val paint = Paint().apply {
        color = Color.BLACK
        style = Paint.Style.FILL
    }
    canvas.drawRect(maskRect, paint)
    return mutableBitmap
}

使用时传入测试好的卡号区域Rect(比如Rect(120, 520, 780, 610)),即可生成打码后的Bitmap。

2. 自动识别卡号后打码(卡号位置不固定场景)

借助OCR工具识别卡号位置后打码,以Google ML Kit为例:

步骤1:添加依赖

在build.gradle中引入ML Kit文本识别依赖:

dependencies {
    implementation 'com.google.mlkit:text-recognition:16.0.0'
}

步骤2:识别卡号位置

fun recognizeAadhaarNumber(context: Context, bitmap: Bitmap, callback: (Rect?) -> Unit) {
    val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
    val image = InputImage.fromBitmap(bitmap, 0)
    recognizer.process(image)
        .addOnSuccessListener { result ->
            val aadhaarRegex = Regex("\\d{4}\\s\\d{4}\\s\\d{4}") // Aadhaar卡号格式匹配
            for (block in result.textBlocks) {
                if (aadhaarRegex.matches(block.text)) {
                    callback(block.boundingBox)
                    return@addOnSuccessListener
                }
            }
            callback(null)
        }
        .addOnFailureListener { e ->
            e.printStackTrace()
            callback(null)
        }
}

步骤3:根据识别结果打码

调用上述识别方法拿到卡号区域后,复用addMaskToFixedArea方法完成打码。

三、保存打码后的图片

将处理后的Bitmap保存回原文件或新文件,确保File Provider可正常访问:

fun saveBitmapToFile(bitmap: Bitmap, file: File) {
    try {
        val outputStream = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)
        outputStream.flush()
        outputStream.close()
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

注意事项

  • 处理大图片时建议先压缩,避免内存溢出;
  • 使用ML Kit OCR可配置离线模型,无需依赖网络;
  • 覆盖原图片后,需通知系统媒体库更新,避免读取缓存内容。

内容的提问来源于stack exchange,提问作者Ambika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:35:28