下面讲解有关二维码的生成:
先来讲解一下对应的入参所表示的意思:
创建二维码位图 (支持自定义配置和自定义样式)
param content 字符串内容
param width 位图宽度,要求>=0(单位:px)
param height 位图高度,要求>=0(单位:px)
param character_set 字符集/字符转码格式 (支持格式:{@link CharacterSetECI })。传null时,zxing源码默认使用 "ISO-8859-1"
param error_correction 容错级别 (支持级别:{@link ErrorCorrectionLevel })。传null时,zxing源码默认使用 "L"
param margin 空白边距 (可修改,要求:整型且>=0), 传null时,zxing源码默认使用"4"。
param color_black 黑色色块的自定义颜色值
param color_white 白色色块的自定义颜色值
下面是具体的实现步骤:
1.参数合法性判断
if (width < 0 || height < 0) { // 宽和高都需要>=0 return null }
2.设置二维码相关配置,生成BitMatrix(位矩阵)对象
val hints: Hashtable<EncodeHintType, String> = Hashtable() if (character_set.isNotEmpty()) { hints[EncodeHintType.CHARACTER_SET] = character_set // 字符转码格式设置 } if (error_correction.isNotEmpty()) { hints[EncodeHintType.ERROR_CORRECTION] = error_correction // 容错级别设置 } if (margin.isNotEmpty()) { hints[EncodeHintType.MARGIN] = margin // 空白边距设置 } val bitMatrix = QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints)
3.创建像素数组,并根据BitMatrix(位矩阵)对象为数组元素赋颜色值
val pixels = IntArray(width * height) for (y in 0 until height) { for (x in 0 until width) { if (bitMatrix[x, y]) { pixels[y * width + x] = color_black // 黑色色块像素设置 } else { pixels[y * width + x] = color_white // 白色色块像素设置 } } }
4.创建Bitmap对象,根据像素数组设置Bitmap每个像素点的颜色值,之后返回Bitmap对象
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) bitmap.setPixels(pixels, 0, width, 0, 0, width, height) return bitmap
最后贴上完整的代码:
fun createQRCodeBitmap( content: String, width: Int, height: Int, character_set: String = "UTF-8", error_correction: String = "H", margin: String = "1", @ColorInt color_black: Int = Color.BLACK, @ColorInt color_white: Int = Color.WHITE ): Bitmap? { if (width < 0 || height < 0) { return null } try { val hints: Hashtable<EncodeHintType, String> = Hashtable() if (character_set.isNotEmpty()) { hints[EncodeHintType.CHARACTER_SET] = character_set } if (error_correction.isNotEmpty()) { hints[EncodeHintType.ERROR_CORRECTION] = error_correction } if (margin.isNotEmpty()) { hints[EncodeHintType.MARGIN] = margin } val bitMatrix = QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints) val pixels = IntArray(width * height) for (y in 0 until height) { for (x in 0 until width) { if (bitMatrix[x, y]) { pixels[y * width + x] = color_black } else { pixels[y * width + x] = color_white } } } val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) bitmap.setPixels(pixels, 0, width, 0, 0, width, height) return bitmap } catch (e: WriterException) { e.printStackTrace() } return null }