• JAVA生成解析二维码


      1 package com.mohe.twocode;
      2  
      3  
      4 import java.awt.Color;
      5 import java.awt.Graphics2D;
      6 import java.awt.image.BufferedImage;
      7 import java.io.File;
      8 import java.io.IOException;
      9 import java.io.InputStream;
     10 import java.io.OutputStream;
     11  
     12  
     13 import javax.imageio.ImageIO;
     14  
     15  
     16 import jp.sourceforge.qrcode.QRCodeDecoder;
     17 import jp.sourceforge.qrcode.data.QRCodeImage;
     18 import jp.sourceforge.qrcode.exception.DecodingFailedException;
     19  
     20  
     21 import com.swetake.util.Qrcode;
     22  
     23  
     24 public class TwoDimensionCode implements QRCodeImage {
     25  
     26  
     27 private BufferedImage bufImg = null;
     28  
     29  
     30 public TwoDimensionCode() {
     31  
     32  
     33 }
     34  
     35  
     36 public TwoDimensionCode(BufferedImage bufImg) {
     37 this.bufImg = bufImg;
     38 }
     39  
     40  
     41 @Override
     42 public int getHeight() {
     43 return bufImg.getHeight();
     44 }
     45  
     46  
     47 @Override
     48 public int getPixel(int x, int y) {
     49 return bufImg.getRGB(x, y);
     50 }
     51  
     52  
     53 @Override
     54 public int getWidth() {
     55 return bufImg.getWidth();
     56 }
     57  
     58  
     59 /**
     60 * 生成二维码(QRCode)图片
     61 * 
     62 * @param content
     63 *            存储内容
     64 * @param imgPath
     65 *            图片路径
     66 */
     67 public void encoderQRCode(String content, String imgPath) {
     68 this.encoderQRCode(content, imgPath, "png", 7);
     69 }
     70  
     71  
     72 /**
     73 * 生成二维码(QRCode)图片
     74 * 
     75 * @param content
     76 *            存储内容
     77 * @param output
     78 *            输出流
     79 */
     80 public void encoderQRCode(String content, OutputStream output) {
     81 this.encoderQRCode(content, output, "png", 7);
     82 }
     83  
     84  
     85 /**
     86 * 生成二维码(QRCode)图片
     87 * 
     88 * @param content
     89 *            存储内容
     90 * @param imgPath
     91 *            图片路径
     92 * @param imgType
     93 *            图片类型
     94 */
     95 public void encoderQRCode(String content, String imgPath, String imgType) {
     96 this.encoderQRCode(content, imgPath, imgType, 7);
     97 }
     98  
     99  
    100 /**
    101 * 生成二维码(QRCode)图片
    102 * 
    103 * @param content
    104 *            存储内容
    105 * @param output
    106 *            输出流
    107 * @param imgType
    108 *            图片类型
    109 */
    110 public void encoderQRCode(String content, OutputStream output, String imgType) {
    111 this.encoderQRCode(content, output, imgType, 7);
    112 }
    113  
    114  
    115 /**
    116 * 生成二维码(QRCode)图片
    117 * 
    118 * @param content
    119 *            存储内容
    120 * @param imgPath
    121 *            图片路径
    122 * @param imgType
    123 *            图片类型
    124 * @param size
    125 *            二维码尺寸
    126 */
    127 public void encoderQRCode(String content, String imgPath, String imgType, int size) {
    128 try {
    129 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
    130  
    131  
    132 File imgFile = new File(imgPath);
    133  
    134  
    135 if (!imgFile.exists()) {
    136 imgFile.mkdirs();
    137 }
    138  
    139  
    140 // 生成二维码QRCode图片
    141 ImageIO.write(bufImg, imgType, imgFile);
    142  
    143  
    144 } catch (Exception e) {
    145 e.printStackTrace();
    146 }
    147 }
    148  
    149  
    150 /**
    151 * 生成二维码(QRCode)图片
    152 * 
    153 * @param content
    154 *            存储内容
    155 * @param output
    156 *            输出流
    157 * @param imgType
    158 *            图片类型
    159 * @param size
    160 *            二维码尺寸
    161 */
    162 public void encoderQRCode(String content, OutputStream output, String imgType, int size) {
    163 try {
    164 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
    165 // 生成二维码QRCode图片
    166 ImageIO.write(bufImg, imgType, output);
    167 } catch (Exception e) {
    168 e.printStackTrace();
    169 }
    170 }
    171  
    172  
    173 /**
    174 * 生成二维码(QRCode)图片的公共方法
    175 * 
    176 * @param content
    177 *            存储内容
    178 * @param imgType
    179 *            图片类型
    180 * @param size
    181 *            二维码尺寸
    182 * @return
    183 */
    184 private BufferedImage qRCodeCommon(String content, String imgType, int size) {
    185 BufferedImage bufImg = null;
    186 try {
    187 Qrcode qrcodeHandler = new Qrcode();
    188 // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
    189 qrcodeHandler.setQrcodeErrorCorrect('M');
    190 qrcodeHandler.setQrcodeEncodeMode('B');
    191 // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
    192 qrcodeHandler.setQrcodeVersion(size);
    193 // 获得内容的字节数组,设置编码格式
    194 byte[] contentBytes = content.getBytes("utf-8");
    195 // 图片尺寸
    196 int imgSize = 67 + 12 * (size - 1);
    197 bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
    198 Graphics2D gs = bufImg.createGraphics();
    199 // 设置背景颜色
    200 gs.setBackground(Color.WHITE);
    201 gs.clearRect(0, 0, imgSize, imgSize);
    202  
    203  
    204 // 设定图像颜色> BLACK
    205 gs.setColor(Color.BLACK);
    206 // 设置偏移量,不设置可能导致解析出错
    207 int pixoff = 2;
    208 // 输出内容> 二维码
    209 if (contentBytes.length > 0 && contentBytes.length < 800) {
    210 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
    211 for (int i = 0; i < codeOut.length; i++) {
    212 for (int j = 0; j < codeOut.length; j++) {
    213 if (codeOut[j][i]) {
    214 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
    215 }
    216 }
    217 }
    218 } else {
    219 throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
    220 }
    221 gs.dispose();
    222 bufImg.flush();
    223 } catch (Exception e) {
    224 e.printStackTrace();
    225 }
    226 return bufImg;
    227 }
    228  
    229  
    230 /**
    231 * 解析二维码(QRCode)
    232 * 
    233 * @param imgPath
    234 *            图片路径
    235 * @return
    236 */
    237 public String decoderQRCode(String imgPath) {
    238 // QRCode 二维码图片的文件
    239 File imageFile = new File(imgPath);
    240 BufferedImage bufImg = null;
    241 String content = null;
    242 try {
    243 bufImg = ImageIO.read(imageFile);
    244 QRCodeDecoder decoder = new QRCodeDecoder();
    245 content = new String(decoder.decode(new TwoDimensionCode(bufImg)), "utf-8");
    246 } catch (IOException e) {
    247 System.out.println("Error: " + e.getMessage());
    248 e.printStackTrace();
    249 } catch (DecodingFailedException dfe) {
    250 System.out.println("Error: " + dfe.getMessage());
    251 dfe.printStackTrace();
    252 }
    253 return content;
    254 }
    255  
    256  
    257 /**
    258 * 解析二维码(QRCode)
    259 * 
    260 * @param input
    261 *            输入流
    262 * @return
    263 */
    264 public String decoderQRCode(InputStream input) {
    265 BufferedImage bufImg = null;
    266 String content = null;
    267 try {
    268 bufImg = ImageIO.read(input);
    269 QRCodeDecoder decoder = new QRCodeDecoder();
    270 content = new String(decoder.decode(new TwoDimensionCode(bufImg)), "utf-8");
    271 } catch (IOException e) {
    272 System.out.println("Error: " + e.getMessage());
    273 e.printStackTrace();
    274 } catch (DecodingFailedException dfe) {
    275 System.out.println("Error: " + dfe.getMessage());
    276 dfe.printStackTrace();
    277 }
    278 return content;
    279 }
    280  
    281  
    282 /**
    283 * 生成二维码
    284 * 
    285 * @param filePath
    286 * @return
    287 */
    288 public static void encoder(String filePath, String deskCode) {
    289  
    290  
    291 String imgPath = filePath + deskCode + ".png";
    292 TwoDimensionCode handler = new TwoDimensionCode();
    293 handler.encoderQRCode(deskCode, imgPath, "png");
    294 }
    295  
    296  
    297 /**
    298 * 解析二维码
    299 * 
    300 * @param filePath
    301 * @return
    302 */
    303 public static String decoder(String filePath, int deskType, String deskCode) {
    304  
    305  
    306 String imgPath = filePath + deskCode + ".png";
    307 TwoDimensionCode handler = new TwoDimensionCode();
    308 return handler.decoderQRCode(imgPath);
    309 }
    310  
    311  
    312 /**
    313 * 生成中间带LOG二维码(QRCode)图片
    314 * 
    315 * @param content
    316 *            二维码图片的内容
    317 * @param imgPath
    318 *            生成二维码图片完整的路径
    319 * @param ccbpath
    320 *            二维码图片中间的logo路径
    321 */
    322 public static int createQRCode(String content, String imgPath, String ccbPath) {
    323  
    324  
    325 try {
    326 Qrcode qrcodeHandler = new Qrcode();
    327 qrcodeHandler.setQrcodeErrorCorrect('M');
    328 qrcodeHandler.setQrcodeEncodeMode('B');
    329 qrcodeHandler.setQrcodeVersion(7);
    330  
    331  
    332 // System.out.println(content);
    333 byte[] contentBytes = content.getBytes("utf-8");
    334 BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
    335 Graphics2D gs = bufImg.createGraphics();
    336  
    337  
    338 gs.setBackground(Color.WHITE);
    339 gs.clearRect(0, 0, 140, 140);
    340  
    341  
    342 // 设定图像颜色 > BLACK
    343 // gs.setColor(new Color(255, 200, 0));
    344 gs.setColor(Color.BLACK);
    345  
    346  
    347 // 设置偏移量 不设置可能导致解析出错
    348 int pixoff = 2;
    349  
    350  
    351 // 输出内容 > 二维码
    352 if (contentBytes.length > 0 && contentBytes.length < 120) {
    353 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
    354 for (int i = 0; i < codeOut.length; i++) {
    355 for (int j = 0; j < codeOut.length; j++) {
    356 if (codeOut[j][i]) {
    357 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
    358 }
    359 }
    360 }
    361 } else {
    362 System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. ");
    363 return -1;
    364 }
    365 // Image img = ImageIO.read(new File(ccbPath));// 实例化一个Image对象。
    366 // gs.drawImage(img, 47, 54, null);
    367 // gs.setColor(Color.BLUE);
    368 // gs.setFont(new Font("微软雅黑", Font.BOLD, 18));
    369 // gs.drawString("交享越", 50, 70);
    370 // gs.dispose();
    371 bufImg.flush();
    372  
    373  
    374 // 生成二维码QRCode图片
    375 File imgFile = new File(imgPath);
    376 ImageIO.write(bufImg, "png", imgFile);
    377  
    378  
    379 } catch (Exception e) {
    380 e.printStackTrace();
    381 return -100;
    382 }
    383  
    384  
    385 return 0;
    386 }
    387  
    388  
    389 public static void main(String[] args) {
    390 // String imgPath = "F:/TDDOWNLOAD/Michael_QRCode.png";
    391 // String encoderContent = "123131";
    392 // TwoDimensionCode handler = new TwoDimensionCode();
    393 // handler.encoderQRCode(encoderContent, imgPath, "png");
    394 // // try {
    395 // // OutputStream output = new FileOutputStream(imgPath);
    396 // // handler.encoderQRCode(content, output);
    397 // // } catch (Exception e) {
    398 // // e.printStackTrace();
    399 // // }
    400 // System.out.println("========encoder success");
    401 //
    402 // String decoderContent = handler.decoderQRCode(imgPath);
    403 // System.out.println("解析结果如下:");
    404 // System.out.println(decoderContent);
    405 // System.out.println("========decoder success!!!");
    406  
    407  
    408 // TwoDimensionCode
    409 // .createQRCode(
    410 // "http://jxy.misuland.com//jxy_manager//downLoadAction!downLoad.action?path=jxy_android.apk",
    411 // "F://jxy_android.png",
    412 // "C:\Documents and Settings\Administrator\My Documents\My Pictures\image\white.jpg");
    413 TwoDimensionCode.createQRCode("http://localhost:8080//jxy_manager//downLoadAction!downLoad.action?path=jxy_android.apk", "F://jxy_android.png", "C:\Documents and Settings\Administrator\My Documents\My Pictures\image\white.jpg");
    414 TwoDimensionCode.createQRCode("http://localhost:8080//jxy_manager//downLoadAction!downLoad.action?path=jxy_ios.apk", "F://jxy_ios.png", "C:\Documents and Settings\Administrator\My Documents\My Pictures\image\white.jpg");
    415 }
    416 }
    417  
    418   
    419  
    420   
    421  
    422 所需jar包可以在这个地址下载http://download.csdn.net/detail/daixinmei/5974269
  • 相关阅读:
    HDU
    【JZOJ1252】【洛谷P5194】天平【搜索】
    【JZOJ1252】【洛谷P5194】天平【搜索】
    【JZOJ3896】战争游戏【割点】
    【JZOJ3896】战争游戏【割点】
    【JZOJ3895】数字对【ST表】
    【JZOJ3895】数字对【ST表】
    【JZOJ3894】改造二叉树【树】【LIS】
    【JZOJ3894】改造二叉树【树】【LIS】
    【洛谷P4014】【网络流24题】分配问题【费用流】
  • 原文地址:https://www.cnblogs.com/lr393993507/p/5542988.html
Copyright © 2020-2023  润新知