使用zxing生成嵌图片的二维码,demo世海夺宝二维码,邀请码

来源:互联网 发布:c语言枚举法例题 编辑:程序博客网 时间:2024/04/29 18:00


扫一扫二维码下载app即送1元夺宝币和100元红包

世海夺宝:

世海夺宝邀请码:yjusbn







首先贴zxing生成二位的源码

zxing的maven

<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>2.2</version></dependency>

package com.cmcc.web.test;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.AffineTransform;import java.awt.image.AffineTransformOp;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.Map;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.WriterException;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;/** * @className:BarcodeFactory* @author : huangziwang* @date 2016年3月21日 下午10:18:53 * @version 1.0* @return*/public class QrcodeUtil {// 图片宽度的一般private static final int IMAGE_WIDTH = 80;private static final int IMAGE_HEIGHT = 80;private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;private static final int FRAME_WIDTH = 2;// 二维码写码器private static MultiFormatWriter mutiWriter = new MultiFormatWriter();/** * @param content 二维码内容 * @param width 高度 * @param height 长度 * @param srcImagePath 中间需要显示的图片 * @param destImagePath 输出图片的路径 */public static void encode(String content, int width, int height,String srcImagePath, String destImagePath) {try {ImageIO.write(genBarcode(content, width, height, srcImagePath),"jpg", new File(destImagePath));} catch (IOException e) {e.printStackTrace();} catch (WriterException e) {e.printStackTrace();}}private static BufferedImage genBarcode(String content, int width,int height, String srcImagePath) throws WriterException,IOException {// 读取源图像BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,IMAGE_HEIGHT, true);int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];for (int i = 0; i < scaleImage.getWidth(); i++) {for (int j = 0; j < scaleImage.getHeight(); j++) {srcPixels[i][j] = scaleImage.getRGB(i, j);}}Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();hint.put(EncodeHintType.CHARACTER_SET, "utf-8");hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 生成二维码BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,width, height, hint);// 二维矩阵转为一维像素数组int halfW = matrix.getWidth() / 2;int halfH = matrix.getHeight() / 2;int[] pixels = new int[width * height];for (int y = 0; y < matrix.getHeight(); y++) {for (int x = 0; x < matrix.getWidth(); x++) {// 读取图片if (x > halfW - IMAGE_HALF_WIDTH&& x < halfW + IMAGE_HALF_WIDTH&& y > halfH - IMAGE_HALF_WIDTH&& y < halfH + IMAGE_HALF_WIDTH) {pixels[y * width + x] = srcPixels[x - halfW+ IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];} // 在图片四周形成边框else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH- IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)) {pixels[y * width + x] = 0xfffffff;} else {// 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;pixels[y * width + x] = matrix.get(x, y) ? 0xff000000: 0xfffffff;}}}BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);image.getRaster().setDataElements(0, 0, width, height, pixels);return image;}/** * 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标 *  * @param srcImageFile *            源文件地址 * @param height *            目标高度 * @param width *            目标宽度 * @param hasFiller *            比例不对时是否需要补白:true为补白; false为不补白; * @throws IOException */private static BufferedImage scale(String srcImageFile, int height,int width, boolean hasFiller) throws IOException {double ratio = 0.0; // 缩放比例File file = new File(srcImageFile);BufferedImage srcImage = ImageIO.read(file);Image destImage = srcImage.getScaledInstance(width, height,BufferedImage.SCALE_SMOOTH);// 计算比例if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {if (srcImage.getHeight() > srcImage.getWidth()) {ratio = (new Integer(height)).doubleValue()/ srcImage.getHeight();} else {ratio = (new Integer(width)).doubleValue()/ srcImage.getWidth();}AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);destImage = op.filter(srcImage, null);}if (hasFiller) {// 补白BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D graphic = image.createGraphics();graphic.setColor(Color.white);graphic.fillRect(0, 0, width, height);if (width == destImage.getWidth(null))graphic.drawImage(destImage, 0,(height - destImage.getHeight(null)) / 2,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);elsegraphic.drawImage(destImage,(width - destImage.getWidth(null)) / 2, 0,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);graphic.dispose();destImage = image;}return (BufferedImage) destImage;}public static void main(String[] args) {QrcodeUtil.encode("www.baidu.com",500, 500, "e:/test/Announced_05.png", "e:/test/11.jpg");}}


Qrcode生成二维码的源码

package com.cmcc.web.test;import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.imageio.ImageIO;import jp.sourceforge.qrcode.QRCodeDecoder;import jp.sourceforge.qrcode.exception.DecodingFailedException;import com.swetake.util.Qrcode;  public class QrcodeUtils {          /**      * 生成二维码(QRCode)图片      * @param content 存储内容      * @param imgPath 图片路径      */      public void encoderQRCode(String content, String imgPath) {          this.encoderQRCode(content, imgPath, "png", 7);      }            /**      * 生成二维码(QRCode)图片      * @param content 存储内容      * @param output 输出流      */      public void encoderQRCode(String content, OutputStream output) {          this.encoderQRCode(content, output, "png", 7);      }            /**      * 生成二维码(QRCode)图片      * @param content 存储内容      * @param imgPath 图片路径      * @param imgType 图片类型      */      public void encoderQRCode(String content, String imgPath, String imgType) {          this.encoderQRCode(content, imgPath, imgType, 7);      }            /**      * 生成二维码(QRCode)图片      * @param content 存储内容      * @param output 输出流      * @param imgType 图片类型      */      public void encoderQRCode(String content, OutputStream output, String imgType) {          this.encoderQRCode(content, output, imgType, 7);      }        /**      * 生成二维码(QRCode)图片      * @param content 存储内容      * @param imgPath 图片路径      * @param imgType 图片类型      * @param size 二维码尺寸      */      public void encoderQRCode(String content, String imgPath, String imgType, int size) {          try {              BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);                            File imgFile = new File(imgPath);              // 生成二维码QRCode图片              ImageIO.write(bufImg, imgType, imgFile);          } catch (Exception e) {              e.printStackTrace();          }      }        /**      * 生成二维码(QRCode)图片      * @param content 存储内容      * @param output 输出流      * @param imgType 图片类型      * @param size 二维码尺寸      */      public void encoderQRCode(String content, OutputStream output, String imgType, int size) {          try {              BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);              // 生成二维码QRCode图片              ImageIO.write(bufImg, imgType, output);          } catch (Exception e) {              e.printStackTrace();          }      }            /**      * 生成二维码(QRCode)图片的公共方法      * @param content 存储内容      * @param imgType 图片类型      * @param size 二维码尺寸      * @return      */      private BufferedImage qRCodeCommon(String content, String imgType, int size) {          BufferedImage bufImg = null;          try {              Qrcode qrcodeHandler = 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 = new BufferedImage(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 {                  throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");              }              gs.dispose();              bufImg.flush();          } catch (Exception e) {              e.printStackTrace();          }          return bufImg;      }            /**      * 解析二维码(QRCode)      * @param imgPath 图片路径      * @return      */      public String decoderQRCode(String imgPath) {          // QRCode 二维码图片的文件          File imageFile = new File(imgPath);          BufferedImage bufImg = null;          String content = null;          try {              bufImg = ImageIO.read(imageFile);              QRCodeDecoder decoder = new QRCodeDecoder();              content = new String(decoder.decode(new QrcodeImageUtils(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;      }            /**      * 解析二维码(QRCode)      * @param input 输入流      * @return      */      public String decoderQRCode(InputStream input) {          BufferedImage bufImg = null;          String content = null;          try {              bufImg = ImageIO.read(input);              QRCodeDecoder decoder = new QRCodeDecoder();              content = new String(decoder.decode(new QrcodeImageUtils(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;      }        public static void main(String[] args) {    // 输出图片的路径        String imgPath = "D:/test.png";        String encoderContent = "www.baidu.com";        System.err.println(encoderContent.length());        QrcodeUtils handler = new QrcodeUtils();        handler.encoderQRCode(encoderContent, imgPath, "png",15);//      try {  //          OutputStream output = new FileOutputStream(imgPath);  //          handler.encoderQRCode(content, output);  //      } catch (Exception e) {  //          e.printStackTrace();  //      }          System.out.println("========encoder success");                  String decoderContent = handler.decoderQRCode(imgPath);          System.out.println("解析结果如下:");          System.out.println(decoderContent);          System.out.println("========decoder success!!!");      }    }


package com.cmcc.web.test;import java.awt.image.BufferedImage;import jp.sourceforge.qrcode.data.QRCodeImage;  public class QrcodeImageUtils implements QRCodeImage {        BufferedImage bufImg;            public QrcodeImageUtils(BufferedImage bufImg) {          this.bufImg = bufImg;      }            public int getHeight() {          return bufImg.getHeight();      }        public int getPixel(int x, int y) {          return bufImg.getRGB(x, y);      }        public int getWidth() {          return bufImg.getWidth();      }    }  





0 0
原创粉丝点击