ZXing生成二维码应直接用MatrixToImageWriter.toBufferedImage(),避免手动遍历BitMatrix;解析时需预处理图像为灰度、确保尺寸≥200×200、显式指定码制与UTF-8编码,并注意Android平台兼容性。

用 ZXing 生成二维码图片,MatrixToImageWriter 是最简路径
直接调用 MatrixToImageWriter.toBufferedImage() 就能拿到 BufferedImage,再用 ImageIO.write() 写出文件。别自己遍历 BitMatrix 像素——既慢又容易反色、错位。
-
width和height必须和HintMap中的QR_CODE尺寸一致,否则图像拉伸或裁剪 - 默认输出黑底白码,想反转得手动改
MatrixToImageConfig的onColor/offColor - 中文内容必须在
EncodeHintType.CHARACTER_SET中显式设为"UTF-8",否则乱码 - 如果输出 PNG 透明背景,
MatrixToImageConfig要传new MatrixToImageConfig(0xFF000000, 0x00FFFFFF)
ZXing 解析二维码失败常见原因:不是识别不准,是输入不对
90% 的 “扫不出来” 问题出在图像预处理环节:BufferedImage 类型不支持、灰度缺失、尺寸过小或 DPI 过低。原图直接丢给 MultiFormatReader.decode() 很可能返回 NotFoundException。
- 务必把图像转成
TYPE_BYTE_GRAY或TYPE_INT_RGB,TYPE_4BYTE_ABGR等带 alpha 通道的类型会干扰二值化 - 小于 200×200 像素的图建议先
Graphics2D.drawImage()放大,否则HybridBinarizer找不到有效模块 - 避免直接用
FileInputStream+ImageIO.read()加载微信截图类图片——它们常带轻微模糊或压缩噪点,加一步GrayFilter预处理更稳 - 解析时传入
HintMap,至少包含DecodeHintType.TRY_HARDER和DecodeHintType.POSSIBLE_FORMATS(如Arrays.asList(BarcodeFormat.QR_CODE))
条形码识别比二维码更依赖图像质量,UPC_EAN_EXTENSION 等格式必须指定
ZXing 默认只尝试常见格式(QR_CODE, CODE_128, EAN_13),遇到 UPC_A、ITF、PDF_417 等冷门码制,不显式声明就直接跳过。
- 用
HashMap<decodehinttype object></decodehinttype>明确传入DecodeHintType.POSSIBLE_FORMATS,值为Arrays.asList(BarcodeFormat.UPC_A, BarcodeFormat.EAN_13) -
EAN_13图像高度不能低于宽度的 1/3,否则OneDResultPoint定位失败;可用BufferedImage.getSubimage()截取中心区域再试 -
ITF(交插二五码)必须保证条空对比度 > 70%,扫描前建议用LookupOp做阈值增强 - 不要指望一张图同时识别二维码和条形码——分开调用两次
MultiFormatReader.decode(),分别配不同POSSIBLE_FORMATS
Android 上用 ZXing 解析要绕开 BufferedImage,Java SE 和 Android 的图像栈不兼容
Android 没有 java.awt.image.BufferedImage,也不能直接用 ImageIO。硬搬桌面端代码会编译失败或运行时 NoClassDefFoundError。
立即学习“Java免费学习笔记(深入)”;
- Android 端统一用
RGBLuminanceSource构造器,传入Bitmap.getPixels()数组,而非BufferedImage - 别用
MatrixToImageWriter生成 Bitmap——它依赖 AWT;改用Bitmap.createBitmap()+ 手动填色,或集成zxing-android-embedded库 - Android 12+ 对后台服务限制严格,
IntentIntegrator启动扫码 Activity 更安全,别在子线程里硬解 - 真机调试时注意闪光灯干扰:部分机型自动补光会让条码反光过曝,解析前加判断
if (bitmap.getHeight() > 1000) bitmap = Bitmap.createScaledBitmap(bitmap, ...)
NotFoundException 再回头查输入图,往往已经绕了两小时。










