使用Java生成二维码 (使用谷歌的zxing)

    xiaoxiao2024-10-28  78

    使用Java生成二维码 (使用谷歌的zxing)

    在项目中不断学习。。。。。。。

     pom.xml导入jar包

    <!--二维码--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> package com.ssm.Utils; 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; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.Arrays; import java.util.Hashtable; public class QRUtils { private static final String CHARSET = "utf-8"; private static final String FORMAT_NAME = "JPG"; //二维码的尺寸 private static final int QRCODE_SIZE = 300; private static final int WIDTH = 60; private static final int HEIGHT = 60; public static BufferedImage createImage(String content,String imgPath,boolean needCompress) throws Exception{ //用于设置QR二维码参数 Hashtable hints = new Hashtable(); //设置QR二维码的纠错级别,H为最高级别 hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H); //设置编码格式 hints.put(EncodeHintType.CHARACTER_SET,CHARSET); //设置二维码空白区域大小 hints.put(EncodeHintType.MARGIN,1); BitMatrix bitMatrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE,QRCODE_SIZE,QRCODE_SIZE,hints); int width = bitMatrix.getWidth(); int height = bitMatrix.getHeight(); BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); for (int x=0;x<width;x++){ for (int y = 0; y <height ; y++) { image.setRGB(x,y,bitMatrix.get(x,y)? 0xFF000000:0xFFFFFFFF); } } if (imgPath == null || "".equals(imgPath)){ return image; } //插入图片 QRUtils.inserImage(image,imgPath,needCompress); return image; } private static void inserImage(BufferedImage source,String imgPath,boolean needCompress) throws Exception{ File file = new File(imgPath); if (!file.exists()){ System.err.println(""+imgPath+" 该文件不存在!"); return; } //读取照片,用Image接收 Image src = ImageIO.read(new File(imgPath)); //获取照片真是宽度 int width = src.getWidth(null); //获取照片真是高度 如果没加载到img对象就会返回-1 int height = src.getHeight(null); if (needCompress){//压缩logo if (width>WIDTH){ width = WIDTH; } if (height>HEIGHT){ height = HEIGHT; } //Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢 Image image = src.getScaledInstance(width,height,Image.SCALE_SMOOTH); /* BufferedImage 是Image的一个子类,Image和BufferedImage的主要作用就是将图片加载到内存中,BufferedImage生成的图片在内存里有一个 图像的缓冲区,利用这个缓冲区可以很方便操作图片,大小变换,图片变灰,透明不透明 BufferedImage img = ImageIO.read(new FileInputStream(path)); 创建一个不带透明色的BufferedImage对象 */ BufferedImage tag = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(image,0,0,null);//绘制缩小后的图 g.dispose(); src = image; } //插入logo Graphics2D graph = source.createGraphics(); int x = (QRCODE_SIZE-width)/2; int y = (QRCODE_SIZE-height)/2; graph.drawImage(src,x,y,width,height,null); Shape shape = new RoundRectangle2D.Float(x,y,width,width,6,6); graph.setStroke(new BasicStroke(3f)); graph.draw(shape); graph.dispose(); } //获取生成二维码的图片流 public static ByteArrayOutputStream encodelIO(String content,String imgPath,Boolean needCompress) throws Exception{ BufferedImage image = QRUtils.createImage(content,imgPath,needCompress); //创建存储图片二进制流的输出流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //将二进制数据写入ByteArrayOutputStream ImageIO.write(image,"jpg",baos); return baos; } public static void main(String[] args) throws Exception { String text = "输入自己的URL"; ByteArrayOutputStream encodeIO = QRUtils.encodelIO(text, "logo图片的路径", true); //输入数组 System.out.println("-------------------------------------"); System.out.println(Arrays.toString(encodeIO.toByteArray())); } }

     

    最新回复(0)