JAVA二维码编码&解码
QRCodeUtil.java
package web;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
/**
 * 二维码编码&解码
 * @Author: ChenGuiYong 2015年7月13日 上午11:09:56
 * @Version: $Id$
 * @Desc: <p></p>
 */
public class QRCodeUtil {
    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;
    /*
     * 解码:
     * 1 将图片反解码为二维矩阵
     * 2 将该二维矩阵解码为内容
     * */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void decode(String imgPath) {
        try {
            File file = new File(imgPath);//获取该图片文件
            BufferedImage image;
            try {
                image = ImageIO.read(file);
                if (image == null) {
                    System.out.println("Could not decode image");
                }
                LuminanceSource source = new BufferedImageLuminanceSource(image);
                BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                Result result;
                Hashtable hints = new Hashtable();//将图片反解码为二维矩阵
                hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
                result = new MultiFormatReader().decode(bitmap, hints);//将该二维矩阵解码成内容
                String resultStr = result.getText();
                System.out.println("解码结果:"+resultStr);  
            } catch (IOException ioe) {
                System.out.println(ioe.toString());
            } catch (ReaderException re) {
                System.out.println(re.toString());
            }  
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    /**
     * 编码
     * @author ChenGuiYong
     * @data 2015年7月13日 上午11:06:20
     * @param contents
     * @param width
     * @param height
     * @param imgPath
     * @param logoPath
     * @return
     */
    public static boolean encode(String contents, int width, int height, String imgPath,String logoPath) {
        Map<EncodeHintType, Object> hints = new Hashtable<>();
        // 指定纠错等级
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        // 指定编码格式
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        //设置二维码内容到边框的距离
        hints.put(EncodeHintType.MARGIN, 1);
        String format = "png";
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints);
            MatrixToImageWriter.writeToStream(bitMatrix, format ,new FileOutputStream(imgPath));
            File qrcodeFile = new File(imgPath);
            //增加logo
            writeToLogo(bitMatrix,format , qrcodeFile, logoPath);
        } catch (Exception e) {
            return false;
        }
        System.out.println("编码成功!");
        return true;
    }
    /**
     * 增加Logo
     * @author ChenGuiYong
     * @data 2015年7月13日 上午11:07:00
     * @param matrix
     * @param format
     * @param file
     * @param logoPath
     * @throws IOException
     */
    public static void writeToLogo(BitMatrix matrix,String format,File file,String logoPath) throws IOException {
        Graphics2D graphics2 = null;
        BufferedImage image = null;
        BufferedImage logo = null;
        try {
            /**
             * 读取二维码图片,并构建绘图对象
             */
            image = toBufferedImage(matrix);
            graphics2 = image.createGraphics();  
            /**
             * 读取Logo图片
             */
            logo = ImageIO.read(new File(logoPath));
            int codeWidth = image.getWidth();
            int codeHeight = image.getHeight();
            /**
             * 设置logo的大小,设置为二维码图片的25%,因为过大会盖掉二维码
             */
            int widthLogo = logo.getWidth(null)>codeWidth*2/13?(codeWidth*2/13):logo.getWidth(null),
                heightLogo = logo.getHeight(null)>codeHeight*2/13?(codeHeight*2/13):logo.getWidth(null);  
            /**
             * 计算图片放置位置
             * logo放在中心
             */
            int x = (codeWidth - widthLogo) / 2;
            int y = (codeHeight - heightLogo) / 2;
            int radius = 14;//圆角范围
            //填充与logo大小类似的扁平化圆角矩形背景
            graphics2.setComposite(AlphaComposite.Src);
            graphics2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            graphics2.setColor(Color.WHITE);
            graphics2.fill(new RoundRectangle2D.Float(x-2, y-2, widthLogo+4, heightLogo+4,radius,radius));
            graphics2.setComposite(AlphaComposite.SrcAtop);
            //开始绘制logo图片
            graphics2.drawImage(logo, x, y, widthLogo, heightLogo, null);  
            if(!ImageIO.write(image, format, file)){
                throw new IOException("Could not write an image of format " + format + " to " + file);
            }
        } catch (Exception e) {
            throw e;
        }finally{
            if(graphics2!=null){
                graphics2.dispose();
            }
            if(logo!=null){
                logo.flush();
            }
            if(image!=null){
                image.flush();
            }
        }
    }
    public static BufferedImage toBufferedImage(BitMatrix matrix){
        int width = matrix.getWidth();
        int height = matrix.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, matrix.get(x, y) ? BLACK : WHITE);
            }
        }
        return image;
    }  
    public static void main(String[] args) {
        String contents="http://www.baidu.com";
        String imgPath = "D:/zxing/zxing.png";
        String logoPath = "D:/logo.png";
        QRCodeUtil.encode(contents, 200, 200, imgPath,logoPath);
        QRCodeUtil.decode(imgPath);
    }
}
												
											JAVA二维码编码&解码的更多相关文章
- java 二维码编码解码
		
做一个小项目的时候写了个二维码编码和解码的小工具,感觉可能用得到,有兴趣的朋友可以看下 再次之前,徐需要用到google的zxing相关的jar包,还有javax相关包 以上为可能用到的jar pac ...
 - Java二维码的解码和编码
		
原文:http://www.open-open.com/code/view/1430906793866 import java.io.File; import java.util.Hashtable; ...
 - Java利用QRCode.jar包实现二维码编码与解码
		
QRcode是日本人94年开发出来的.首先去QRCode的官网http://swetake.com/qrcode/java/qr_java.html,把要用的jar包下下来,导入到项目里去.qrcod ...
 - Java二维码生成与解码
		
基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...
 - 二维码编码与解码类库ThoughtWorks.QRCode
		
官方地址:https://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library 有源代码和示例程序 支持二维码编码(生成)和解码( ...
 - Atitit java 二维码识别 图片识别
		
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
 - Java 二维码--转载
		
周末试用下Android手机的二维码扫描软件,扫描了下火车票.名片等等,觉得非常不错很有意思的.当然Java也可以实现这些,现在就分享下如何简单用Java实现二维码中QRCode的编码和解码(可以手机 ...
 - java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
		
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
 - Halcon一维码和二维码的解码步骤和技巧——第11讲
		
针对Halcon中一维码和二维码的解码,我分别写了两篇文章,参见: <Halcon的一维条码解码步骤和解码技巧>:https://www.cnblogs.com/xh6300/p/1048 ...
 
随机推荐
- [CSP-S模拟测试]:那一天我们许下约定(DP+组合数学)
			
题目传送门(内部题2) 输入格式 每个测试点有多组测试数据.对于每组数据,有一行共三个整数$N$,$D$,$M$含义如题.输入结束标识为$“0 0 0”$ (不含引号). 输出格式 对于每组数据,输出 ...
 - BZOJ3033太鼓达人
			
第一问,1<<k,谁都看得出来. 毫无思路,暴搜,枚举每一个数列,Hash加map判断是否重复,拿到30,打表都打不出来. #include <iostream> #inclu ...
 - Java并发编程(十一)——原子操作CAS
			
一.原子操作 syn基于阻塞的锁的机制,1.被阻塞的线程优先级很高,2.拿到锁的线程一直不释放锁怎么办?3.大量的竞争,消耗cpu,同时带来死锁或者其他安全. CAS的原理 CAS(Compare A ...
 - 邻居子系统 之 邻居表的初始化neigh_table_init
			
概述 邻居子系统支持多种实现,例如ARP,ND等,这些实现需要在其初始化的时候,调用neigh_table_init将邻居表项添加到全局邻居子系统数组中,并对实例中的字段(如hash,定时器等)进行相 ...
 - beta week 2/2 Scrum立会报告+燃尽图 06
			
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9959 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名: ...
 - SpringBoot Thymeleaf 配置多个Template Locations
			
@Configuration public class ThymeleafConfigration { @Bean public SpringResourceTemplateResolver firs ...
 - EBS GL 日记账行“账户说明”段说明显示不全
			
问题描述: 路径:总帐管理超级用户/日记帐/输入 如下图所示,日记账行的“账户说明字段”段值说明显示不全 解决方法: 路径:总帐管理超级用户/设置/财务系统/弹性域/关键字/段 如下图所示,找到相应的 ...
 - android 知识体系
 - mybatis的mapper映射文件
			
1概述1.1应用架构 mybatis框架用于支持对关系数据库的操作,该体系的应用架构如下图所示: 在mybatis框架体系中,主要的组件是:SqlSessionFactoryBean和Mapp ...
 - css的绝对布局问题,怎么让子元素置于底部?
			
给子元素做定位.用position标签示例:<html><head><style type="text/css">p.pos_abs{posit ...