二维码生成

来源:互联网 发布:多功能网络线材测试仪 编辑:程序博客网 时间:2024/06/06 00:01
使用java代码生成二维码:
1:pom.xml文件
<dependency>    <groupId>com.google.zxing</groupId>    <artifactId>core</artifactId>    <version>3.1.0</version></dependency>
2:文字介绍


3:logo 的地址

4:代码块
package com.test3;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.File;import java.util.Date;import java.util.HashMap;import java.util.Map;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;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;import com.test3.Base64;public class ZXingCode { private static final int QRCOLOR = 0xFF000000; //默认是黑色    private static final int BGWHITE = 0xFFFFFFFF; //背景颜色    public static void main(String[] args) throws WriterException     {         try         {             getLogoQRCode("https://www.baidu.com/", null, "跳转到百度");        }         catch (Exception e)         {             e.printStackTrace();         }     }        /**     * 生成带logo的二维码图片     *     * @param qrPic     * @param logoPic     */    public static String getLogoQRCode(String qrUrl,HttpServletRequest request,String productName)    {// String filePath = request.getSession().getServletContext().getRealPath("/") + "resources/images/logoImages/llhlogo.png";        //filePath是二维码logo的路径,但是实际中我们是放在项目的某个路径下面的,所以路径用上面的,把下面的注释就好        String filePath = "E:/618.jpg"; //TODO         String content = qrUrl;        try        {             ZXingCode zp = new ZXingCode();            BufferedImage bim = zp.getQR_CODEBufferedImage(content, BarcodeFormat.QR_CODE, 400, 400, zp.getDecodeHintType());            return zp.addLogo_QRCode(bim, new File(filePath), new LogoConfig(), productName);        }        catch (Exception e)        {            e.printStackTrace();        }        return null;    }        /**     * 给二维码图片添加Logo     *     * @param qrPic     * @param logoPic     */    public String addLogo_QRCode(BufferedImage bim, File logoPic, LogoConfig logoConfig, String productName)    {        try        {            /**             * 读取二维码图片,并构建绘图对象             */            BufferedImage image = bim;            Graphics2D g = image.createGraphics();            /**             * 读取Logo图片             */            BufferedImage logo = ImageIO.read(logoPic);            /**             * 设置logo的大小,本人设置为二维码图片的20%,因为过大会盖掉二维码             */            int widthLogo = logo.getWidth(null)>image.getWidth()*3/10?(image.getWidth()*3/10):logo.getWidth(null),                 heightLogo = logo.getHeight(null)>image.getHeight()*3/10?(image.getHeight()*3/10):logo.getWidth(null);            /**             * logo放在中心             */             int x = (image.getWidth() - widthLogo) / 2;             int y = (image.getHeight() - heightLogo) / 2;             /**             * logo放在右下角             * int x = (image.getWidth() - widthLogo);             * int y = (image.getHeight() - heightLogo);             */            //开始绘制图片            g.drawImage(logo, x, y, widthLogo, heightLogo, null);// g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);// g.setStroke(new BasicStroke(logoConfig.getBorder()));// g.setColor(logoConfig.getBorderColor());// g.drawRect(x, y, widthLogo, heightLogo);            g.dispose();            //把商品名称添加上去,商品名称不要太长哦,这里最多支持两行。太长就会自动截取啦            if (productName != null && !productName.equals("")) {                //新的图片,把带logo的二维码下面加上文字                BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);                Graphics2D outg = outImage.createGraphics();                //画二维码到新的面板                outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);                //画文字到新的面板                outg.setColor(Color.BLACK);                 outg.setFont(new Font("宋体",Font.BOLD,30)); //字体、字型、字号                 int strWidth = outg.getFontMetrics().stringWidth(productName);                if (strWidth > 399) {// //长度过长就截取前面部分// outg.drawString(productName, 0, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 5 ); //画文字                    //长度过长就换行                    String productName1 = productName.substring(0, productName.length()/2);                    String productName2 = productName.substring(productName.length()/2, productName.length());                    int strWidth1 = outg.getFontMetrics().stringWidth(productName1);                    int strWidth2 = outg.getFontMetrics().stringWidth(productName2);                    outg.drawString(productName1, 200 - strWidth1/2, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 12 );                    BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);                    Graphics2D outg2 = outImage2.createGraphics();                    outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);                    outg2.setColor(Color.BLACK);                     outg2.setFont(new Font("宋体",Font.BOLD,30)); //字体、字型、字号                     outg2.drawString(productName2, 200 - strWidth2/2, outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight())/2 + 5 );                    outg2.dispose();                     outImage2.flush();                    outImage = outImage2;                }else {                    outg.drawString(productName, 200 - strWidth/2 , image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 12 ); //画文字                 }                outg.dispose();                 outImage.flush();                image = outImage;            }            logo.flush();            image.flush();            ByteArrayOutputStream baos = new ByteArrayOutputStream();            baos.flush();            ImageIO.write(image, "png", baos);                        //二维码生成的路径,但是实际项目中,我们是把这生成的二维码显示到界面上的,因此下面的折行代码可以注释掉            //可以看到这个方法最终返回的是这个二维码的imageBase64字符串            //前端用 <img src="data:image/png;base64,${imageBase64QRCode}"/> 其中${imageBase64QRCode}对应二维码的imageBase64字符串            ImageIO.write(image, "png", new File("D:/users/TDC-" + new Date().getTime() + "test.png")); //TODO                         String imageBase64QRCode = Base64.encode(baos.toByteArray());            baos.close();            return imageBase64QRCode;        }        catch (Exception e)        {            e.printStackTrace();        }        return null;    }    /**     * 构建初始化二维码     *     * @param bm     * @return     */    public BufferedImage fileToBufferedImage(BitMatrix bm)    {        BufferedImage image = null;        try        {            int w = bm.getWidth(), h = bm.getHeight();            image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);            for (int x = 0; x < w; x++)            {                for (int y = 0; y < h; y++)                {                    image.setRGB(x, y, bm.get(x, y) ? 0xFF000000 : 0xFFCCDDEE);                }            }        }        catch (Exception e)        {            e.printStackTrace();        }        return image;    }    /**     * 生成二维码bufferedImage图片     *     * @param content     * 编码内容     * @param barcodeFormat     * 编码类型     * @param width     * 图片宽度     * @param height     * 图片高度     * @param hints     * 设置参数     * @return     */    public BufferedImage getQR_CODEBufferedImage(String content, BarcodeFormat barcodeFormat, int width, int height, Map<EncodeHintType, ?> hints)    {        MultiFormatWriter multiFormatWriter = null;        BitMatrix bm = null;        BufferedImage image = null;        try        {            multiFormatWriter = new MultiFormatWriter();            // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数            bm = multiFormatWriter.encode(content, barcodeFormat, width, height, hints);            int w = bm.getWidth();            int h = bm.getHeight();            image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);            // 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色            for (int x = 0; x < w; x++)            {                for (int y = 0; y < h; y++)                {                    image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);                }            }        }        catch (WriterException e)        {            e.printStackTrace();        }        return image;    }    /**     * 设置二维码的格式参数     *     * @return     */    public Map<EncodeHintType, Object> getDecodeHintType()    {        // 用于设置QR二维码参数        Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();        // 设置QR二维码的纠错级别(H为最高级别)具体级别信息        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);        // 设置编码方式        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");        hints.put(EncodeHintType.MARGIN, 0);        hints.put(EncodeHintType.MAX_SIZE, 350);        hints.put(EncodeHintType.MIN_SIZE, 100);        return hints;    }}    class LogoConfig    {        // logo默认边框颜色        public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;        // logo默认边框宽度        public static final int DEFAULT_BORDER = 2;        // logo大小默认为照片的1/5        public static final int DEFAULT_LOGOPART = 5;        private final int border = DEFAULT_BORDER;        private final Color borderColor;        private final int logoPart;        /**         * Creates a default config with on color {@link #BLACK} and off color         * {@link #WHITE}, generating normal black-on-white barcodes.         */        public LogoConfig()        {            this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);        }        public LogoConfig(Color borderColor, int logoPart)        {            this.borderColor = borderColor;            this.logoPart = logoPart;        }        public Color getBorderColor()        {            return borderColor;        }        public int getBorder()        {            return border;        }        public int getLogoPart()        {            return logoPart;        }}
5:生成需要的工具类
package com.test3;public final class Base64 { static private final int BASELENGTH = 128; static private final int LOOKUPLENGTH = 64; static private final int TWENTYFOURBITGROUP = 24; static private final int EIGHTBIT = 8; static private final int SIXTEENBIT = 16; static private final int FOURBYTE = 4; static private final int SIGN = -128; static private final char PAD = '='; static private final boolean fDebug = false; static final private byte[] base64Alphabet = new byte[BASELENGTH]; static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; static {  for (int i = 0; i < BASELENGTH; ++i) {   base64Alphabet[i] = -1;  }  for (int i = 'Z'; i >= 'A'; i--) {   base64Alphabet[i] = (byte) (i - 'A');  }  for (int i = 'z'; i >= 'a'; i--) {   base64Alphabet[i] = (byte) (i - 'a' + 26);  }  for (int i = '9'; i >= '0'; i--) {   base64Alphabet[i] = (byte) (i - '0' + 52);  }  base64Alphabet['+'] = 62;  base64Alphabet['/'] = 63;  for (int i = 0; i <= 25; i++) {   lookUpBase64Alphabet[i] = (char) ('A' + i);  }  for (int i = 26, j = 0; i <= 51; i++, j++) {   lookUpBase64Alphabet[i] = (char) ('a' + j);  }  for (int i = 52, j = 0; i <= 61; i++, j++) {   lookUpBase64Alphabet[i] = (char) ('0' + j);  }  lookUpBase64Alphabet[62] = (char) '+';  lookUpBase64Alphabet[63] = (char) '/'; } private static boolean isWhiteSpace(char octect) {  return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); } private static boolean isPad(char octect) {  return (octect == PAD); } private static boolean isData(char octect) {  return (octect < BASELENGTH && base64Alphabet[octect] != -1); } /**  * Encodes hex octects into Base64  *   * @param binaryData  * Array containing binaryData  * @return Encoded Base64 array  */ public static String encode(byte[] binaryData) {  if (binaryData == null) {   return null;  }  int lengthDataBits = binaryData.length * EIGHTBIT;  if (lengthDataBits == 0) {   return "";  }  int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;  int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;  int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;  char encodedData[] = null;  encodedData = new char[numberQuartet * 4];  byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;  int encodedIndex = 0;  int dataIndex = 0;  if (fDebug) {   System.out.println("number of triplets = " + numberTriplets);  }  for (int i = 0; i < numberTriplets; i++) {   b1 = binaryData[dataIndex++];   b2 = binaryData[dataIndex++];   b3 = binaryData[dataIndex++];   if (fDebug) {    System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);   }   l = (byte) (b2 & 0x0f);   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);   byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);   byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);   if (fDebug) {    System.out.println("val2 = " + val2);    System.out.println("k4 = " + (k << 4));    System.out.println("vak = " + (val2 | (k << 4)));   }   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];   encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];   encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];  }  // form integral number of 6-bit groups  if (fewerThan24bits == EIGHTBIT) {   b1 = binaryData[dataIndex];   k = (byte) (b1 & 0x03);   if (fDebug) {    System.out.println("b1=" + b1);    System.out.println("b1<<2 = " + (b1 >> 2));   }   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];   encodedData[encodedIndex++] = PAD;   encodedData[encodedIndex++] = PAD;  } else if (fewerThan24bits == SIXTEENBIT) {   b1 = binaryData[dataIndex];   b2 = binaryData[dataIndex + 1];   l = (byte) (b2 & 0x0f);   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);   byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];   encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];   encodedData[encodedIndex++] = PAD;  }  return new String(encodedData); } /**  * Decodes Base64 data into octects  *   * @param encoded  * string containing Base64 data  * @return Array containind decoded data.  */ public static byte[] decode(String encoded) {  if (encoded == null) {   return null;  }  char[] base64Data = encoded.toCharArray();  // remove white spaces  int len = removeWhiteSpace(base64Data);  if (len % FOURBYTE != 0) {   return null;// should be divisible by four  }  int numberQuadruple = (len / FOURBYTE);  if (numberQuadruple == 0) {   return new byte[0];  }  byte decodedData[] = null;  byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;  char d1 = 0, d2 = 0, d3 = 0, d4 = 0;  int i = 0;  int encodedIndex = 0;  int dataIndex = 0;  decodedData = new byte[(numberQuadruple) * 3];  for (; i < numberQuadruple - 1; i++) {   if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))     || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) {    return null;   }// if found "no data" just return null   b1 = base64Alphabet[d1];   b2 = base64Alphabet[d2];   b3 = base64Alphabet[d3];   b4 = base64Alphabet[d4];   decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);  }  if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {   return null;// if found "no data" just return null  }  b1 = base64Alphabet[d1];  b2 = base64Alphabet[d2];  d3 = base64Data[dataIndex++];  d4 = base64Data[dataIndex++];  if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters   if (isPad(d3) && isPad(d4)) {    if ((b2 & 0xf) != 0)// last 4 bits should be zero    {     return null;    }    byte[] tmp = new byte[i * 3 + 1];    System.arraycopy(decodedData, 0, tmp, 0, i * 3);    tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);    return tmp;   } else if (!isPad(d3) && isPad(d4)) {    b3 = base64Alphabet[d3];    if ((b3 & 0x3) != 0)// last 2 bits should be zero    {     return null;    }    byte[] tmp = new byte[i * 3 + 2];    System.arraycopy(decodedData, 0, tmp, 0, i * 3);    tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);    tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));    return tmp;   } else {    return null;   }  } else { // No PAD e.g 3cQl   b3 = base64Alphabet[d3];   b4 = base64Alphabet[d4];   decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);  }  return decodedData; } /**  * remove WhiteSpace from MIME containing encoded Base64 data.  *   * @param data  * the byte array of base64 data (with WS)  * @return the new length  */ private static int removeWhiteSpace(char[] data) {  if (data == null) {   return 0;  }  // count characters that's not whitespace  int newSize = 0;  int len = data.length;  for (int i = 0; i < len; i++) {   if (!isWhiteSpace(data[i])) {    data[newSize++] = data[i];   }  }  return newSize; }}











原创粉丝点击