BitmapUtils.kt 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.example.chemical.utils
  2. import android.graphics.*
  3. import android.util.Log
  4. import com.example.chemical.ui.PrintBean
  5. import com.google.zxing.BarcodeFormat
  6. import com.google.zxing.EncodeHintType
  7. import com.google.zxing.MultiFormatWriter
  8. import com.google.zxing.WriterException
  9. import com.rc.core.log.RcLog
  10. object BitmapUtils {
  11. fun generateBitmap(printDate: PrintBean): Bitmap? {
  12. // 设置画布尺寸
  13. val width = 400
  14. val height = 400 // 225 * 3,每行占 225 的高度
  15. // 创建 Bitmap
  16. val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
  17. // 创建 Canvas
  18. val canvas = Canvas(bitmap)
  19. // 设置背景色
  20. canvas.drawColor(Color.WHITE)
  21. // 居中绘制二维码
  22. val qrCodeSize = 225
  23. val qrCodeX = (width - qrCodeSize) / 2
  24. val qrCodeY = 0
  25. drawQRCode(printDate.wxCode, canvas, qrCodeX, qrCodeY, 230)
  26. // 在二维码下方居中绘制文本
  27. val text = "编码:${printDate.tag}"
  28. val textX = (width - getTextWidth(text, 20)) / 2
  29. val textY = qrCodeY + qrCodeSize - 6
  30. drawText(canvas, text, textX, textY.toFloat(), 19)
  31. // 计算剩余内容的起始 Y 坐标
  32. val contentStartY = textY + 30
  33. // 绘制剩余的内容,左对齐显示
  34. val content = listOf(
  35. "${printDate.level} 一 ${printDate.name}",
  36. "CAS:${printDate.casNo} ${printDate.types}",
  37. "归属人:${printDate.person}",
  38. )
  39. val lineHeight = 24
  40. content.forEachIndexed { index, line ->
  41. drawText(canvas, line, 10f, contentStartY + index * lineHeight.toFloat(), 20)
  42. }
  43. return bitmap
  44. }
  45. fun generateBitmap(isBelong: Boolean, printDate: PrintBean): Bitmap? {
  46. // 设置画布尺寸
  47. val width = 400
  48. val height = 400 // 225 * 3,每行占 225 的高度
  49. // 创建 Bitmap
  50. val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
  51. // 创建 Canvas
  52. val canvas = Canvas(bitmap)
  53. // 设置背景色
  54. canvas.drawColor(Color.WHITE)
  55. // 居中绘制二维码
  56. val qrCodeSize = 225
  57. val qrCodeX = (width - qrCodeSize) / 2
  58. val qrCodeY = 0
  59. drawQRCode(printDate.wxCode, canvas, qrCodeX, qrCodeY, 230)
  60. // 在二维码下方居中绘制文本
  61. val text = "编码:${printDate.tag}"
  62. val textX = (width - getTextWidth(text, 20)) / 2
  63. val textY = qrCodeY + qrCodeSize - 6
  64. drawText(canvas, text, textX, textY.toFloat(), 19)
  65. // 计算剩余内容的起始 Y 坐标
  66. val contentStartY = textY + 30
  67. // 绘制剩余的内容,左对齐显示
  68. val string: String = if (isBelong) {
  69. "归属人:${printDate.person} "
  70. } else {
  71. "课题组:${printDate.person} "
  72. }
  73. val content = listOf(
  74. "${printDate.level} 一 ${printDate.name}",
  75. "CAS:${printDate.casNo} ${printDate.types}",
  76. string,
  77. )
  78. val lineHeight = 24
  79. content.forEachIndexed { index, line ->
  80. drawText(canvas, line, 10f, contentStartY + index * lineHeight.toFloat(), 20)
  81. }
  82. return bitmap
  83. }
  84. //编码 生成二维码
  85. private fun drawQRCode(tag: String, canvas: Canvas, x: Int, y: Int, size: Int) {
  86. val multiFormatWriter = MultiFormatWriter()
  87. try {
  88. val bitMatrix = multiFormatWriter.encode(
  89. "$tag", // 你想要生成二维码的内容
  90. BarcodeFormat.QR_CODE,
  91. size,
  92. size,
  93. hashMapOf(EncodeHintType.CHARACTER_SET to "UTF-8")
  94. )
  95. val width = bitMatrix.width
  96. val height = bitMatrix.height
  97. val pixels = IntArray(width * height)
  98. for (y in 0 until height) {
  99. val offset = y * width
  100. for (x in 0 until width) {
  101. pixels[offset + x] = if (bitMatrix.get(x, y)) Color.BLACK else Color.WHITE
  102. }
  103. }
  104. val qrCodeBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
  105. qrCodeBitmap.setPixels(pixels, 0, width, 0, 0, width, height)
  106. canvas.drawBitmap(qrCodeBitmap, x.toFloat(), y.toFloat(), null)
  107. } catch (e: WriterException) {
  108. Log.e("BitmapUtils", "Failed to generate QR code: ${e.message}")
  109. }
  110. }
  111. private fun drawText(canvas: Canvas, text: String, x: Float, y: Float, textSize: Int) {
  112. val paint = Paint(Paint.ANTI_ALIAS_FLAG)
  113. paint.color = Color.BLACK
  114. paint.textSize = textSize.toFloat()
  115. paint.typeface = Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)
  116. canvas.drawText(text, x, y, paint)
  117. }
  118. private fun getTextWidth(text: String, textSize: Int): Float {
  119. val paint = Paint(Paint.ANTI_ALIAS_FLAG)
  120. paint.textSize = textSize.toFloat()
  121. return paint.measureText(text)
  122. }
  123. //气瓶信息打印
  124. fun airBottlePrint(rfid: String): Bitmap? {
  125. // 设置画布尺寸
  126. val width = 400
  127. val height = 400 // 225 * 3,每行占 225 的高度
  128. // 创建 Bitmap
  129. val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
  130. // 创建 Canvas
  131. val canvas = Canvas(bitmap)
  132. // 设置背景色
  133. canvas.drawColor(Color.WHITE)
  134. // 居中绘制二维码
  135. val qrCodeSize = 225
  136. val qrCodeX = (width - qrCodeSize) / 2
  137. RcLog.info("======二维码剧中数据$qrCodeX")
  138. val qrCodeY = 6
  139. drawQRCode(rfid, canvas, qrCodeX, qrCodeY, 230)
  140. // 在二维码下方居中绘制文本
  141. val text = "" +
  142. "$rfid"
  143. val textX = (width - getTextWidth(text, 20)) / 2
  144. val textY = qrCodeY + qrCodeSize - 6
  145. drawText(canvas, text, textX, textY.toFloat(), 19)
  146. // 计算剩余内容的起始 Y 坐标
  147. val contentStartY = textY + 30
  148. // 绘制剩余的内容,左对齐显示
  149. val content = listOf(
  150. "",
  151. "",
  152. "",
  153. )
  154. val lineHeight = 24
  155. content.forEachIndexed { index, line ->
  156. drawText(canvas, line, 10f, contentStartY + index * lineHeight.toFloat(), 20)
  157. }
  158. return bitmap
  159. }
  160. }