图片二维码生成工具类(扫码直接跳转)

1、首先需要导入jar包

<dependency>
   <groupId>com.google.zxing</groupId>
   <artifactId>core</artifactId>
   <version>2.2</version>
</dependency>

2、工具类

package util;

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 javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Hashtable;

public class QrCodeUtils {

	public static byte[] creatRrCode(String contents, int width, int height) {
        String binary = null;
        Hashtable hints = new Hashtable();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                    contents, BarcodeFormat.QR_CODE, width, height, hints);
            // 1、读取文件转换为字节数组
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            BufferedImage image = toBufferedImage(bitMatrix);
            //转换成png格式的IO流
            ImageIO.write(image, "png", out);
            byte[] bytes = out.toByteArray();

            // 2、将字节数组转为二进制
            return bytes;
        } catch (WriterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * image流数据处理
     *
     * @author ianly
     */
    public static BufferedImage toBufferedImage(BitMatrix matrix) {
        int width = matrix.getWidth();
        int height = matrix.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, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        return image;
    }

	public static void main(String[] args) {
		
		byte[] bytes = creatRrCode("http://www.baidu.com.cn", 200, 200);
		FileOutputStream fos = null;
		try {
			 fos = new FileOutputStream(new File("d:/qrcode.png"));
			fos.write(bytes);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(fos!=null){
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}

}

3、调用(页面直接使用<img>标签获取控制器生成的图片)

@RequestMapping("/makeQrCode")
    public void qfCode(HttpServletRequest request,HttpServletResponse response) throws IOException {
        byte[] bytes = QrCodeUtils.creatRrCode(“你想跳转的路径(可以配合前端传参数)”, 200, 200);
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        BufferedImage bi1 = ImageIO.read(bais);
        // 禁止图像缓存。
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        try {
            ImageIO.write(bi1, "jpg", response.getOutputStream());//不管输出什么格式图片,此处不需改动
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(bais!=null){
                bais.close();
            }
        }
    }

页面js

function make() {
        layer.open({
            type:1,
            area: ["400px","400px"],
            title:"家政服务人员信用信息二维码生成",
            shadeClose: false,
            content:'<p style="text-align:center"><img src="${base}/makeQrCode"/></p>',
            btn:['打印二维码','关闭'],
            yes: function (index,layero) {
                window.print();
            },
            btn2: function(){
                window.close();
            }
        });
    }

 

### 实现Java后端动态生成跳转到指定链接的二维码 为了实现在Java后端动态生成包含指定链接的二维码,并将其作为URL返回给前端,可以按照如下方法操作: #### 使用Hutool库和ZXing库来创建二维码图像文件并存储于服务器上,之后通过API接口获取该文件路径。 首先,在项目中引入必要的Maven依赖项[^3]: ```xml <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> </dependency> ``` 接着编写用于生成二维码的服务逻辑代。这里展示了一个简单的Spring Boot控制器示例,它接收一个HTTP请求参数`url`表示要编的目标网址,然后调用工具函数生成对应的二维码图片保存至本地磁盘,并最终构建出可供访问此图片资源的绝对URL地址返回给客户端应用。 ```java import cn.hutool.core.io.FileUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class QRController { @GetMapping("/generateQR") public String generateQR(@RequestParam String url) { // 定义输出目录以及文件名前缀 final String OUTPUT_DIR = "/tmp/qrcodes/"; final String FILE_PREFIX = "qr_"; // 创建临时文件夹(如果不存在的话) FileUtil.mkdir(OUTPUT_DIR); // 构建完整的文件路径名称 String filePath = OUTPUT_DIR + FILE_PREFIX + System.currentTimeMillis() + ".png"; try { // 利用Hutool提供的便捷方法快速生成二维码图形对象 BufferedImage qrImage = QrCodeUtil.createQrCode(url, 400); // 将BufferedImage写入目标位置 FileUtil.writeImg(filePath, qrImage); // 返回带有主机域名的实际下载链接供前端消费 return "http://yourdomain.com/" + filePath.substring(filePath.lastIndexOf("/") + 1); } catch (Exception ex) { throw new RuntimeException("Failed to create QR code.", ex); } } } ``` 上述代片段展示了如何利用Hutool中的`QrCodeUtil`类轻松完成从字符串到二维码图像的数据转换过程。需要注意的是,实际部署环境中应当替换掉硬编部分如`/tmp/qrcodes/`这样的固定路径为应用程序配置属性所定义的位置;另外就是关于安全性和性能优化方面也需加以考虑,比如设置合理的缓存策略防止频繁重复生产相同的二维码造成不必要的计算开销等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值