搞定了,转成 byte[] 就能对上了。参考链接:https://blog.csdn.net/qq_27721169/article/details/96312517
要我说,干脆赶紧放弃那种手动画图生成二维码的方式,直接使用谷歌的zxing类库,多香,何必自己折腾,毫无意义
本人知道了
你生成的二维码估计是UTF-8,生成二维码的编码格式得和解码的编码格式一致
System.out.println("result");就是一个字符串是不变的,result是一个变量 宝贝长点心吧
资料下载里面有
貌似是没有读取到数据
是偏移量没加报错。加了偏移量就好了。
文件名字打错了没有
谢谢!
writetofile()上那根线的意思是方法已经被弃用了吧,可能是版本问题
应该是二维码生成时的循环,没有加偏移量(视频中老师没有操作),导致解析时数组下标越界,图片中红线处,复制过来的源码是没有加的
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;
}
}
应该是忘了定义偏移量
这个需要用try/catch处理异常的
参见http://bbs.itheima.com/thread-279075-1-1.html
代码有问题,贴代码出来让大家看一看。
第二个包我咋下不了
高度和宽度:64+12*(版本号-1);
有两种可能,一种是你的代码哪里漏掉了东西或者写错了,第二种就是你的二维码内容不匹配,我以前就是写的二维码内容不匹配生成的二维码是空白;
应该是二维码生成时的循环,没有加偏移量(视频中老师没有操作),导致解析时数组下标越界,图片中红线处,复制过来的源码是没有加的
已经解决
把new 删掉 改成 Graphics2D gs = bufferedImage.createGraphics();
不是编码的问题,还是生成的图片有问题,大家看那个双重for循环gs.fillRect方法,大家如果i在外层循环,j在内层循环(个人习惯),应该gs.fillRect(i*3+pixoff,j*3+pixoff, 3, 3);,而不是gs.fillRect(j*3+pixoff,i*3+pixoff, 3, 3);j和i的位置问题,我生成的图片扫描出来www.imooc.com,但是解析确实一串数字,发现i和j写反了
去看源代码