JAVA生成二维码

前两天工作需要上网查了一下JAVA生成二维码程序的方法,试了几种都全报一此小BUG,并且在二维码中添加LOGO的会无法解析,后来调整一下生成的信息量,便能正常生成了,二维生成的原理类似于针孔打印机原理。下面上代码:

 说明:需要用到jar工具包为QRCode.jar 

 

 

类1:

package com.tyzs.util;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;


public class TwoDimensionCodeImage implements QRCodeImage {

 BufferedImage bufImg;

 public TwoDimensionCodeImage(BufferedImagebufImg) {
  this.bufImg = bufImg;
 }

 public int getHeight() {
  returnbufImg.getHeight();
 }

 public int getPixel(int x, int y) {
  return bufImg.getRGB(x,y);
 }

 public int getWidth() {
  return bufImg.getWidth();
 }

}


 

 

类2:

package com.tyzs.util;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;


public class TwoDimensionCode {

 
 public void encoderQRCode(String content, StringimgType, int size,
   StringimagePath) {
  BufferedImage bufImg =null;
  try {
   QrcodeqrcodeHandler = new Qrcode();
   //设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
   qrcodeHandler.setQrcodeErrorCorrect('M');
   qrcodeHandler.setQrcodeEncodeMode('B');
   //设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
   qrcodeHandler.setQrcodeVersion(size);
   //获得内容的字节数组,设置编码格式
   byte[]contentBytes = content.getBytes("utf-8");
   // 图片尺寸
   int imgSize =67 + 12 * (size - 1);
   bufImg = newBufferedImage(imgSize, imgSize,
     BufferedImage.TYPE_INT_RGB);
   Graphics2D gs= bufImg.createGraphics();
   //设置背景颜色
   gs.setBackground(Color.WHITE);
   gs.clearRect(0,0, imgSize, imgSize);

   //设定图像颜色> BLACK
   gs.setColor(Color.BLACK);
   //设置偏移量,不设置可能导致解析出错
   int pixoff =2;
   // 输出内容>二维码
   if(contentBytes.length > 0 && contentBytes.length <800) {
    boolean[][]codeOut = qrcodeHandler.calQrcode(contentBytes);
    for(int i = 0; i < codeOut.length; i++) {
     for(int j = 0; j < codeOut.length; j++) {
      if(codeOut[j][i]) {
       gs.fillRect(j* 3 + pixoff, i * 3 + pixoff, 3, 3);
      }
     }
    }
   } else{
    thrownew Exception("QRCode content bytes length = "
      +contentBytes.length + " not in [0, 800].");
   }
   //LOGO
   

   gs.dispose();
   bufImg.flush();
  } catch (Exception e) {
   e.printStackTrace();
  }

  // 生成二维码QRCode图片
  try {
   File imgFile= new File(imagePath);
   ImageIO.write(bufImg,imgType, imgFile);
  } catch (IOException e) {
   // TODOAuto-generated catch block
   e.printStackTrace();
  }

 }

 
 public String decoderQRCode(String imgPath){
  // QRCode 二维码图片的文件
  File imageFile = newFile(imgPath);
  BufferedImage bufImg =null;
  String content = null;
  try {
   bufImg =ImageIO.read(imageFile);
   QRCodeDecoderdecoder = new QRCodeDecoder();
   content = newString(decoder.decode(new TwoDimensionCodeImage(
     bufImg)),"utf-8");
  } catch (IOException e) {
   System.out.println("Error:" + e.getMessage());
   e.printStackTrace();
  } catch(DecodingFailedException dfe) {
   System.out.println("Error:" + dfe.getMessage());
   dfe.printStackTrace();
  }
  return content;
 }

}


 

类3:测试类

package com.tyzs.test;

import com.tyzs.util.TwoDimensionCode;

public class Test {
 public static void main(String[] args) {
  String imgPath ="F:/test.png";
  String encoderContent ="http://www.weibo.com/tuanyaozhishang";
  TwoDimensionCode handler = newTwoDimensionCode();
  handler.encoderQRCode(encoderContent,"png", 20, imgPath); // 内容 图片路径

  // 图片格式 大小

  System.out.println("========encodersuccess");

  String decoderContent =handler.decoderQRCode(imgPath); // 图片路径
  System.out.println("解析结果如下:");
  System.out.println(decoderContent);
  System.out.println("========decodersuccess!!!");
 }
}


效果图如下:

 

JAVA生成二维码   JAVA生成二维码

 

JAVA生成二维码


        后记:关于jar可以去网上下载,也可以给我留言索要,这里logo的路径我写死了,你也可以在生成方法中添加一个logo的路径参数,方便调用。  技术路很长,努力积累便是海洋!    抟摇直上 2013-08-12

 

转载说明:http://blog.sina.com.cn/s/blog_918966b40101budt.html

### 使用 Java 生成二维码 (QR Code) 在 Java生成二维码,最常用的方法是使用 **ZXing**(Zebra Crossing)库。ZXing 是一个开源的、跨平台的条形码和二维码生成与解析库,支持多种编码格式和纠错机制。 #### 1. Maven 依赖配置 首先,在 `pom.xml` 文件中添加 ZXing 的依赖: ```xml <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.5.2</version> </dependency> ``` #### 2. 生成二维码的核心代码 以下是一个简单的 Java 示例,展示如何使用 ZXing 生成二维码并将其保存为图像文件: ```java import com.google.zxing.*; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; public class QRCodeGenerator { public static void generateQRCode(String data, String filePath, int width, int height) throws WriterException, IOException { // 设置二维码的纠错级别 QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(data, BarcodeFormat.QR_CODE, width, height, com.google.zxing.EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 写入文件 Path path = FileSystems.getDefault().getPath(filePath); MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path); } public static void main(String[] args) { String data = "https://www.example.com"; String filePath = "qrcode.png"; int width = 300; int height = 300; try { generateQRCode(data, filePath, width, height); System.out.println("二维码生成成功!"); } catch (Exception e) { System.err.println("生成二维码失败:" + e.getMessage()); } } } ``` #### 3. 自定义二维码(添加 Logo) 如果希望在二维码中心添加 Logo,可以在生成二维码图像后,使用 `BufferedImage` 和 `Graphics2D` 将 Logo 叠加到二维码图像上: ```java import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; public class QRCodeWithLogo { public static void addLogoToQRCode(String qrCodePath, String logoPath, String outputFilePath, int logoSize) throws Exception { BufferedImage qrImage = ImageIO.read(new File(qrCodePath)); BufferedImage logo = ImageIO.read(new File(logoPath)); // 调整 Logo 大小 Image scaledLogo = logo.getScaledInstance(logoSize, logoSize, Image.SCALE_SMOOTH); BufferedImage resizedLogo = new BufferedImage(logoSize, logoSize, BufferedImage.TYPE_INT_ARGB); Graphics2D g = resizedLogo.createGraphics(); g.drawImage(scaledLogo, 0, 0, null); g.dispose(); // 在二维码中心绘制 Logo Graphics2D graphics = qrImage.createGraphics(); int x = (qrImage.getWidth() - logoSize) / 2; int y = (qrImage.getHeight() - logoSize) / 2; graphics.drawImage(resizedLogo, x, y, null); graphics.dispose(); // 保存结果 ImageIO.write(qrImage, "PNG", new File(outputFilePath)); } public static void main(String[] args) throws Exception { String qrCodePath = "qrcode.png"; String logoPath = "logo.png"; String outputFilePath = "qrcode_with_logo.png"; int logoSize = 50; addLogoToQRCode(qrCodePath, logoPath, outputFilePath, logoSize); System.out.println("二维码添加 Logo 成功!"); } } ``` #### 4. 常见问题处理 在使用 ZXing 生成二维码时,可能会遇到如下异常: - **`data bits cannot fit in the QR Code`**:表示数据量超出了当前版本二维码的容量限制。可以通过提高二维码的版本(`Version`)或降低数据量来解决。例如,使用 `EncodeHintType.QR_VERSION` 设置更高的版本[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值