| package com.matrix.component.tools; | 
|   | 
| import com.google.zxing.BarcodeFormat; | 
| import com.google.zxing.EncodeHintType; | 
| import com.google.zxing.MultiFormatWriter; | 
| import com.google.zxing.common.BitMatrix; | 
| import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; | 
| import com.matrix.core.tools.PropertiesUtil; | 
| import com.matrix.core.tools.StringUtils; | 
| import com.matrix.core.tools.UUIDUtil; | 
| import com.matrix.system.common.constance.AppConstance; | 
|   | 
| import javax.imageio.ImageIO; | 
| import java.awt.*; | 
| import java.awt.geom.RoundRectangle2D; | 
| import java.awt.image.BufferedImage; | 
| import java.io.File; | 
| import java.io.OutputStream; | 
| import java.text.SimpleDateFormat; | 
| import java.util.Date; | 
| import java.util.Hashtable; | 
|   | 
|   | 
| public class CodeUtil { | 
|      | 
|     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,String title) 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 (StringUtils.isNotBlank(imgPath)) {   | 
|             // 插入图片   | 
|             CodeUtil.insertImage(image, imgPath, needCompress);   | 
|         }   | 
|         if(StringUtils.isNotBlank(title)){ | 
|             //插入标题 | 
|             //  CodeUtil.insertTitle(image, title);   | 
|         } | 
|          | 
|          | 
|         return image;   | 
|     } | 
|    | 
|     private static void insertTitle(BufferedImage source, String title) { | 
|            | 
|          BufferedImage image = new BufferedImage(300, 360,   | 
|                  BufferedImage.TYPE_INT_RGB); | 
|          for (int x = 0; x < 300; x++) {   | 
|              for (int y = 0; y < 360; y++) {   | 
|                  image.setRGB(x, y, 0xFFFFFFFF);   | 
|              }   | 
|          }   | 
|           | 
|          Graphics2D graph = image.createGraphics();   | 
|           | 
|          graph.drawImage(source, 20, 60, 300, 300, null);   | 
|          Shape shape = new RoundRectangle2D.Float(20, 60, 300, 300, 6, 6);   | 
|          graph.setStroke(new BasicStroke(3f));   | 
|          graph.draw(shape);   | 
|           | 
|          | 
|             // 插入LOGO   | 
|           graph.setFont(new Font("黑体", Font.BOLD, 36)); | 
|           graph.setColor(Color.BLACK); | 
|           graph.drawString(title, 10, 10); | 
|           graph.dispose();   | 
|     } | 
|   | 
|     /**  | 
|      * 插入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 = CodeUtil.createImage(content, imgPath,   | 
|                 needCompress,null);   | 
|         mkdirs(destPath);//new Random().nextInt(99999999) | 
|   | 
|         String file = UUIDUtil.getRandomID()+".jpg"; | 
|         ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));   | 
|     }   | 
|      | 
|     public static String encode(String content, String imgPath, boolean needCompress, | 
|             String title) throws Exception {   | 
|         BufferedImage image = CodeUtil.createImage(content, imgPath,   | 
|                 needCompress,title);   | 
|      // 图片保存目录路径 | 
|         String savePath = PropertiesUtil.getString(AppConstance.FILES_TORAGE_PATH); | 
|         // 图片保存目录URL | 
|         String saveUrl = PropertiesUtil.getString(AppConstance.NGINX_URL); | 
|         // 以账号ID命名创建文件夹 | 
|         savePath+="qrCode" + File.separatorChar; | 
|         saveUrl+="qrCode" +  File.separatorChar; | 
|      // 创建是日期文件夹 | 
|          SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); | 
|          String ymd = sdf.format(new Date()); | 
|          savePath+= ymd + File.separatorChar; | 
|          saveUrl+=ymd + "/"; | 
|         mkdirs(savePath);//new Random().nextInt(99999999) | 
|         String file = UUIDUtil.getRandomID()+".jpg"; | 
|         ImageIO.write(image, FORMAT_NAME, new File(savePath+"/"+file));   | 
|         return saveUrl+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 {   | 
|         CodeUtil.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 {   | 
|         CodeUtil.encode(content, null, destPath, needCompress);   | 
|     }   | 
|    | 
|     /**  | 
|      * 生成二维码  | 
|      *   | 
|      * @param content  | 
|      *            内容  | 
|      * @param destPath  | 
|      *            存储地址  | 
|      * @throws Exception  | 
|      */   | 
|     public static void encode(String content, String destPath) throws Exception {   | 
|         CodeUtil.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 = CodeUtil.createImage(content, imgPath,   | 
|                 needCompress,null);   | 
|         ImageIO.write(image, FORMAT_NAME, output);   | 
|     }   | 
|    | 
|     /**  | 
|      * 生成二维码  | 
|      *   | 
|      * @param content  | 
|      *            内容  | 
|      * @param output  | 
|      *            输出流  | 
|      * @throws Exception  | 
|      */   | 
|     public static void encode(String content, OutputStream output)   | 
|             throws Exception {   | 
|         CodeUtil.encode(content, null, output, false);   | 
|     }   | 
|    | 
|       | 
|    | 
|     public static void main(String[] args) throws Exception {   | 
|        /* String text = "http://www.baidu.com"; | 
|         System.out.println(CodeUtil.encode(text, "",  true, "你好","111"));*/ | 
|          | 
|     }    | 
|       | 
| } |