在开发Android应用时,我们经常需要处理图像和文本数据,特别是当涉及到二维码生成和条形码信息展示时。本文将介绍如何在Android应用中实现一个功能,即将二维码图像保存到设备存储,并在图像下方添加条形码文本信息。为了实现这一功能,我们将编写一个函数saveImageToStorage,该函数将处理图像的获取、合并以及最终的保存操作。
private fun saveImageToStorage() {
//首先,我们需要从对话框视图dialogView中获取ImageView和TextView的实例。ImageView用于显示二维码图像,
//而TextView用于显示条形码数字。val imageView = dialogView.findViewById<ImageView>(R.id.imageView)val textViewBarcodeNumber = dialogView.findViewById<TextView>(R.id.textViewBarcodeNumber)
/接下来,我们检查ImageView中的drawable是否为BitmapDrawable,
//如果是,则从中提取出Bitmap对象。这个Bitmap对象代表了我们需要处理的二维码图像。if (imageView.drawable is BitmapDrawable) {// 获取二维码图像val qrCodeBitmap = (imageView.drawable as BitmapDrawable).bitmapval mergedBitmap = Bitmap.createBitmap(qrCodeBitmap.width,qrCodeBitmap.height + textViewBarcodeNumber.height,qrCodeBitmap.config)val canvas = Canvas(mergedBitmap)canvas.drawColor(Color.WHITE) // 设置背景为白色// 绘制条形码canvas.drawBitmap(qrCodeBitmap, 0f, 0f, null)// 解析二维码内容val width = qrCodeBitmap.widthval height = qrCodeBitmap.heightval pixels = IntArray(width * height)qrCodeBitmap.getPixels(pixels, 0, width, 0, 0, width, height)// 创建 LuminanceSource 对象val source = RGBLuminanceSource(width, height, pixels)val binaryBitmap = BinaryBitmap(HybridBinarizer(source))// 解析二维码内容// 读取二维码val reader = MultiFormatReader()val result = reader.decode(binaryBitmap)// 获取解析出的文本val barcodeText = result.text// 绘制 TextView 的文本val paint = Paint().apply {color = Color.BLACKtextSize = 40f // 设置字体大小,可以调整textAlign = Paint.Align.CENTERisAntiAlias = true // 启用抗锯齿}// 从二维获取条形码文本,并检查其长度是否为12位(EAN-13条形码格式)。// 如果长度正确,我们将文本分成几段,并分别计算它们在Canvas上的位置,然后绘制出来。if (barcodeText.length >= 12) {// 设置文本位置,调整 Y 坐标以适应文本高度val firstDigit = barcodeText.substring(0, 1)val lastSixDigits = barcodeText.substring(1, 7)val productCode = barcodeText.substring(7, 12)val checkDigit = barcodeText.substring(12) // 校验位// 计算每段文本的位置,添加间隔canvas.drawText(firstDigit, 50f, 530f, paint) // 第一位canvas.drawText(lastSixDigits, 150f, 530f, paint) // 后六位canvas.drawText( productCode , 300f, 530f, paint)canvas.drawText( checkDigit, 368f, 530f, paint)// 保存合并后的图像QRGeneratorUtils.saveImageToExternalStorage(context, mergedBitmap)Toast.makeText(context, R.string.image_stored_in_gallery, Toast.LENGTH_LONG).show()} else {Toast.makeText(context, "二维码解析失败", Toast.LENGTH_SHORT).show()return}}}