二维码的使用场景越来越多,大家也越来越倾向于扫一扫来实现信息的获取,那么二维码到底是怎么生成的呢,接下来讲述我们是怎么将一串信息转化为二维码图片的代码如下:
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.EnumMap; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * 根据字符串生成二维码工具类 */ public class QrCodeUtil { //二维码颜色 0x00000000,黑色 (注:二维码颜色色差大,扫描快,但如果"BLACK'设置为黑色外其他颜色,可能无法扫描) private static final int BLACK = 0x00000000; // 二维码背景色 0xFFFFFFFF,白色 private static final int WHITE = 0xFFFFFFFF; //二维码图片宽度 private static final int width = 300; //二维码图片高度 private static final int height = 300; // 二维码格式参数 private static final EnumMap<EncodeHintType, Object> hints = new EnumMap<>(EncodeHintType.class); static { //二维码的纠错级别(排错率),4个级别:L (7%)、M (15%)、Q (25%)、H (30%)(最高H),纠错信息同样存储在二维码中, //纠错级别越高,纠错信息占用的空间越多,那么能存储的有用讯息就越少;选择M,扫描速度快。 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 二维码边界空白大小 1,2,3,4 (4为默认,最大) hints.put(EncodeHintType.MARGIN, 1); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); } /** * 测试主函数 * @param args */ public static void main(String[] args) { String content = "abc123456";//需要转化为二维码的信息 String format = "png"; //生成的图片将会保存到d盘根目录下,也可以自己设置路径 writeToFile(content,format,new File("D:"+File.separator+"qrcode.png")); } /** * 二维码输出到文件 * @param contents 二维码内容 * @param format 图片格式 * @param file 输出文件 */ public static void writeToFile(String contents, String format, File file) { BufferedImage image = encodeImg(contents); try { ImageIO.write(image, format, file); } catch (IOException e) { System.out.println("二维码写入文件失败" + e); } } /** * 绘制二维码 * @param contents 二维码内容 * @return image 二维码图片 */ public static BufferedImage encodeImg(String contents) { BufferedImage image = null; try { BitMatrix matrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints); image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); int width = matrix.getWidth(); int height = matrix.getHeight(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE); } } } catch (Exception e) { System.out.println("生成二维码失败" + e); } return image; } }