问答详情
源自:6-4 使用QR Code方式生成和解析二维码

数据长度修改后,会报错

d.length < 120 只能输入14个字符长度信息的内容,太小了,将120修改之后,就会报错java.lang.ArrayIndexOutOfBoundsException,这个怎么解决?

http://img.mukewang.com/58fea6c40001541513240294.jpg

提问者:慕粉1523472586 2017-04-25 09:30

个回答

  • 慕粉1523472586
    2017-05-24 13:49:34

    package com.wang.test;


    import java.awt.Color;

    import java.awt.Graphics2D;

    import java.awt.Image;

    import java.awt.image.BufferedImage;

    import java.io.File;

    import javax.imageio.ImageIO;

    import com.swetake.util.Qrcode;



    /**

     * 生成二维码

     * @author Developer Name

     *

     */

    public class Test3 {

    public static void main(String[] args) throws Exception {

    String content = "ART M20327,#115664742,9TXZFHPB00185";

    String outPath = "D:\\qrCode\\code.jpg";

    String logoPath = "D:\\qrCode\\logo.png";

    creatQrCode(1, 0, content, outPath, logoPath);

    }


    /**

    * 生成二维码

    * @param version   版本

    * @param content   内容

    * @param outPath   输出路径

    * @param logoPath  图标路径

    * @param pixoff    偏移量

    * @throws Exception

    */

    public static void creatQrCode(int version,  int pixoff, String content, String outPath,

    String logoPath) throws Exception {


    // 图片尺寸

    int width = 67 + 12 * (version - 1);

    int height = 67 + 12 * (version - 1);

    //int width = 30;

    //int height = 30;


    // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小

    Qrcode code = new Qrcode();

    code.setQrcodeErrorCorrect('M');

    code.setQrcodeEncodeMode('B');


    // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大

    code.setQrcodeVersion(version);


    BufferedImage bufferImage = new BufferedImage(width, height,

    BufferedImage.TYPE_INT_RGB);

    Graphics2D gs = bufferImage.createGraphics();

    // 设置背景颜色

    gs.setBackground(Color.WHITE);

    // 设定图像颜色> BLACK

    gs.setColor(Color.BLACK);

    //清空画板

    gs.clearRect(0, 0, width, height);


    // 获得内容的字节数组,设置编码格式

    byte[] contentBytes = content.getBytes("gb2312");

    // 输出内容> 二维码

    if (contentBytes.length > 0 && contentBytes.length < 120) {

    boolean[][] codeOut = code.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].");

    }

    createPhotoAtCenter(bufferImage, logoPath);

    gs.dispose();

    bufferImage.flush();


    ImageIO.write(bufferImage, "jpg", new File(outPath));

    }


    /**

    * 加入logo

    * @param bufImg     要添加的二维码对象

    * @param logoPath   要添加logo的路径

    * @return

    * @throws Exception

    */

    private static BufferedImage createPhotoAtCenter(BufferedImage bufImg, String logoPath) throws Exception {

    Image image = ImageIO.read(new File(logoPath));

    Graphics2D graphics = bufImg.createGraphics();


    // 获取bufImg的中间位置

    int centerX = bufImg.getMinX() + bufImg.getWidth() / 2 - 30 / 2;

    int centerY = bufImg.getMinY() + bufImg.getHeight() / 2 - 30 / 2;

    graphics.drawImage(image, centerX + 35, centerY, 30, 30, null);

    graphics.dispose();

    bufImg.flush();

    return bufImg;

    }

    }


  • 只要我想
    2017-05-10 11:08:15

    少导个包import java.io.File;

    debug一下看看或把代码都发给我