• 制作、解析带logo的二维码


    用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码

    工具:GooleZXing

    首先下GooleZXing的jar包。

    ----------------------------------------生成二维码------------------------------------------------

    public class GooleZXingQRCodeUtil {


    private static final String CHARSET = "utf-8"; 
    private static final String FORMAT_NAME = "JPG"; 
    // 二维码尺寸 
    private static final int QRCODE_SIZE = 300; 
    // LOGO宽度 
    private static final int WIDTH = 60; 
    // LOGO高度 
    private static final int HEIGHT = 60; 

    private static BufferedImage createImage(String content, String imgPath, 
    boolean needCompress) throws Exception { 
    Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); 
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 
    hints.put(EncodeHintType.CHARACTER_SET, CHARSET); 
    //hints.put(EncodeHintType.MARGIN, 1); 
    BitMatrix bitMatrix = new MultiFormatWriter().encode(content, 
    BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints); 
    int width = bitMatrix.getWidth(); 
    int height = bitMatrix.getHeight(); 
    BufferedImage image = new BufferedImage(width, height, 
    BufferedImage.TYPE_INT_RGB); 
    for (int x = 0; x < width; x++) { 
    for (int y = 0; y < height; y++) { 
    image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 
    : 0xFFFFFFFF); 


    if (imgPath == null || "".equals(imgPath)) { 
    return image; 

    // 插入图片 
    GooleZXingQRCodeUtil.insertImage(image, imgPath, needCompress); 
    return image; 


    /** 
    * 插入LOGO 

    * @param source 
    * 二维码图片 
    * @param imgPath 
    * LOGO图片地址 
    * @param needCompress 
    * 是否压缩 
    * @throws Exception 
    */ 
    private static void insertImage(BufferedImage source, String imgPath, 
    boolean needCompress) throws Exception { 
    File file = new File(imgPath); 
    if (!file.exists()) { 
    System.err.println(""+imgPath+" 该文件不存在!"); 
    return; 

    Image src = ImageIO.read(new File(imgPath)); 
    int width = src.getWidth(null); 
    int height = src.getHeight(null); 
    if (needCompress) { // 压缩LOGO 
    if (width > WIDTH) { 
    width = WIDTH; 

    if (height > HEIGHT) { 
    height = HEIGHT; 

    Image image = src.getScaledInstance(width, height, 
    Image.SCALE_SMOOTH); 
    BufferedImage tag = new BufferedImage(width, height, 
    BufferedImage.TYPE_INT_RGB); 
    Graphics g = tag.getGraphics(); 
    g.drawImage(image, 0, 0, null); // 绘制缩小后的图 
    g.dispose(); 
    src = image; 

    // 插入LOGO 
    Graphics2D graph = source.createGraphics(); 
    int x = (QRCODE_SIZE - width) / 2; 
    int y = (QRCODE_SIZE - height) / 2; 
    graph.drawImage(src, x, y, width, height, null); 
    Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); 
    graph.setStroke(new BasicStroke(3f)); 
    graph.draw(shape); 
    graph.dispose(); 


    /** 
    * 生成二维码(内嵌LOGO) 

    * @param content 
    * 内容 
    * @param imgPath 
    * LOGO地址 
    * @param destPath 
    * 存放目录 
    * @param needCompress 
    * 是否压缩LOGO 
    * @throws Exception 
    */ 
    public static void encode(String content, String imgPath, String destPath, 
    boolean needCompress) throws Exception { 
    BufferedImage image = GooleZXingQRCodeUtil.createImage(content, imgPath, 
    needCompress); 
    mkdirs(destPath); 
    String file = new Random().nextInt(99999999)+".jpg"; 
    ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file)); 


    /** 
    * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) 
    * @author lanyuan 
    * Email: mmm333zzz520@163.com 
    * @date 2013-12-11 上午10:16:36 
    * @param destPath 存放目录 
    */ 
    public static void mkdirs(String destPath) { 
    File file =new File(destPath); 
    //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) 
    if (!file.exists() && !file.isDirectory()) { 
    file.mkdirs(); 



    /** 
    * 生成二维码(内嵌LOGO) 

    * @param content 
    * 内容 
    * @param imgPath 
    * LOGO地址 
    * @param destPath 
    * 存储地址 
    * @throws Exception 
    */ 
    public static void encode(String content, String imgPath, String destPath) 
    throws Exception { 
    GooleZXingQRCodeUtil.encode(content, imgPath, destPath, false); 


    /** 
    * 生成二维码 

    * @param content 
    * 内容 
    * @param destPath 
    * 存储地址 
    * @param needCompress 
    * 是否压缩LOGO 
    * @throws Exception 
    */ 
    public static void encode(String content, String destPath, 
    boolean needCompress) throws Exception { 
    GooleZXingQRCodeUtil.encode(content, null, destPath, needCompress); 


    /** 
    * 生成二维码 

    * @param content 
    * 内容 
    * @param destPath 
    * 存储地址 
    * @throws Exception 
    */ 
    public static void encode(String content, String destPath) throws Exception { 
    GooleZXingQRCodeUtil.encode(content, null, destPath, false); 


    /** 
    * 生成二维码(内嵌LOGO) 

    * @param content 
    * 内容 
    * @param imgPath 
    * LOGO地址 
    * @param output 
    * 输出流 
    * @param needCompress 
    * 是否压缩LOGO 
    * @throws Exception 
    */ 
    public static void encode(String content, String imgPath, 
    OutputStream output, boolean needCompress) throws Exception { 
    BufferedImage image = GooleZXingQRCodeUtil.createImage(content, imgPath, 
    needCompress); 
    ImageIO.write(image, FORMAT_NAME, output); 


    /** 
    * 生成二维码 

    * @param content 
    * 内容 
    * @param output 
    * 输出流 
    * @throws Exception 
    */ 
    public static void encode(String content, OutputStream output) 
    throws Exception { 
    GooleZXingQRCodeUtil.encode(content, null, output, false); 


    /** 
    * 解析二维码 

    * @param file 
    * 二维码图片 
    * @return 
    * @throws Exception 
    */ 
    public static String decode(File file) throws Exception { 
    BufferedImage image; 
    image = ImageIO.read(file); 
    if (image == null) { 
    return null; 

    BufferedImageLuminanceSource source = new BufferedImageLuminanceSource( 
    image); 
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); 
    Result result; 
    Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(); 
    hints.put(DecodeHintType.CHARACTER_SET, CHARSET); 
    result = new MultiFormatReader().decode(bitmap, hints); 
    String resultStr = result.getText(); 
    return resultStr; 


    /** 
    * 解析二维码 

    * @param path 
    * 二维码图片地址 
    * @return 
    * @throws Exception 
    */ 
    public static String decode(String path) throws Exception { 
    return GooleZXingQRCodeUtil.decode(new File(path)); 


    public static void main(String[] args) throws Exception { 
    // String text = "I'm a Shiny boy!!"; 
    // GooleZXingQRCodeUtil.encode(text, "F:/test/twocode/123.jpg", "F:/test/twocode/", true);


    String imgPath = "F:/test/twocode/girl.png";
    String rs=GooleZXingQRCodeUtil.decode(imgPath);
    System.out.println("解析结果="+" "+rs);


    }

    -----------------------------------------解析二维码(可带logo图片)-------------------------------------

    public class BufferedImageLuminanceSource extends LuminanceSource { 
    private final BufferedImage image; 
    private final int left; 
    private final int top; 

    public BufferedImageLuminanceSource(BufferedImage image) { 
    this(image, 0, 0, image.getWidth(), image.getHeight()); 


    public BufferedImageLuminanceSource(BufferedImage image, int left, 
    int top, int width, int height) { 
    super(width, height); 

    int sourceWidth = image.getWidth(); 
    int sourceHeight = image.getHeight(); 
    if (left + width > sourceWidth || top + height > sourceHeight) { 
    throw new IllegalArgumentException( 
    "Crop rectangle does not fit within image data."); 


    for (int y = top; y < top + height; y++) { 
    for (int x = left; x < left + width; x++) { 
    if ((image.getRGB(x, y) & 0xFF000000) == 0) { 
    image.setRGB(x, y, 0xFFFFFFFF); // = white 




    this.image = new BufferedImage(sourceWidth, sourceHeight, 
    BufferedImage.TYPE_BYTE_GRAY); 
    this.image.getGraphics().drawImage(image, 0, 0, null); 
    this.left = left; 
    this.top = top; 



    public byte[] getRow(int y, byte[] row) { 
    if (y < 0 || y >= getHeight()) { 
    throw new IllegalArgumentException( 
    "Requested row is outside the image: " + y); 

    int width = getWidth(); 
    if (row == null || row.length < width) { 
    row = new byte[width]; 

    image.getRaster().getDataElements(left, top + y, width, 1, row); 
    return row; 



    public byte[] getMatrix() { 
    int width = getWidth(); 
    int height = getHeight(); 
    int area = width * height; 
    byte[] matrix = new byte[area]; 
    image.getRaster().getDataElements(left, top, width, height, matrix); 
    return matrix; 



    public boolean isCropSupported() { 
    return true; 



    public LuminanceSource crop(int left, int top, int width, int height) { 
    return new BufferedImageLuminanceSource(image, this.left + left, 
    this.top + top, width, height); 



    public boolean isRotateSupported() { 
    return true; 



    public LuminanceSource rotateCounterClockwise() { 
    int sourceWidth = image.getWidth(); 
    int sourceHeight = image.getHeight(); 
    AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 
    0.0, 0.0, sourceWidth); 
    BufferedImage rotatedImage = new BufferedImage(sourceHeight, 
    sourceWidth, BufferedImage.TYPE_BYTE_GRAY); 
    Graphics2D g = rotatedImage.createGraphics(); 
    g.drawImage(image, transform, null); 
    g.dispose(); 
    int width = getWidth(); 
    return new BufferedImageLuminanceSource(rotatedImage, top, 
    sourceWidth - (left + width), getHeight(), width); 

    }

    到此为止,利用Zxing生成和解析二维码就讲述演示完毕,主要为自己做备忘,同时方便有需要的人。呵呵!

  • 相关阅读:
    git 常用命令
    重要知识点
    HTML 标记语言
    js类型转换
    伪数组变数组 js
    在 JavaScript 中为什么 typeof null 的结果是 object?
    HTML中href、src区别
    解决for循环插入同一元素无法重复插入问题
    HTML5-语义化
    mount 和 /etc/fstab关系。
  • 原文地址:https://www.cnblogs.com/xiexy/p/3967925.html
Copyright © 2020-2023  润新知