Java将字符串生成二维码并下载图片

前言

今天记录一下最近写的下载二维码的代码,实现类似微信样式的二维码。主要是先生成二维码,再用Java的Graphics2D画图添加边框样式和文字,最后下载图片。

具体实现

  1. 添加依赖包
		<dependency>
		    <groupId>com.google.zxing</groupId>
		    <artifactId>core</artifactId>
		    <version>3.3.0</version>
		</dependency>
		<dependency>
		    <groupId>com.google.zxing</groupId>
		    <artifactId>javase</artifactId>
		    <version>3.3.0</version>
		</dependency>
  1. 代码引入包
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
  1. 具体方法代码
public void exportQuickResponseCode(HttpServletRequest request, HttpServletResponse response) throws Exception{
		String msg = "好孩子,你还扫这个码";
        String filename = "123.png";
        String path = "D:/1000/" + filename;
        String orgText = "中华人民共和国人民的二维码";
        String goodsNameText = "送你一亿二维码";
        try {
            File file=new File(path);
            OutputStream ous=new FileOutputStream(file);
            Map<EncodeHintType,String> map =new HashMap<EncodeHintType, String>();
            //设置编码 EncodeHintType类中可以设置MAX_SIZE, ERROR_CORRECTION,CHARACTER_SET,DATA_MATRIX_SHAPE,AZTEC_LAYERS等参数
            map.put(EncodeHintType.CHARACTER_SET,"UTF-8");
            map.put(EncodeHintType.MARGIN,"2");
            //生成二维码
            BitMatrix bitMatrix = new MultiFormatWriter().encode(msg, BarcodeFormat.QR_CODE,600,600,map);
            MatrixToImageWriter.writeToStream(bitMatrix,"png",ous);
            
            // 绘制图片
            BufferedImage backgroundImage = new BufferedImage(1000, 1100, BufferedImage.TYPE_INT_RGB);
            BufferedImage image = ImageIO.read(file);
            Graphics2D rng=backgroundImage.createGraphics();
            rng.setColor( new Color(30, 171, 58));//设置笔刷颜色
            rng.fillRect(0,0,1000,1100);
            rng.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP));
            rng.drawImage(image,200,250,600,600,null);
            // 绘制文字
            rng.setColor(Color.white);
            rng.setFont(new Font("黑体",Font.BOLD,46));
            rng.drawString(orgText,(1000-13*46)/2,220);
            rng.drawString(goodsNameText,(1000-7*46)/2,900);
            
            rng.dispose();
            image = backgroundImage;
            image.flush();
            ImageIO.write(image, "png", file);
            
            // 以下是下载图片
			// 当文件名不是英文名的时候,最好使用url解码器去编码一下,
			filename=URLEncoder.encode(filename,"UTF-8");
			// 将响应的类型设置为图片
			response.setContentType("image/png");
			response.setHeader("Content-Disposition", "attachment;filename=" + filename);
			FileInputStream fileInputStream = new FileInputStream(file);
			OutputStream out = response.getOutputStream();
			int len = 0;
			byte[] by = new byte[1024*10];
			while ((len = fileInputStream.read(by))>0){
				out.write(by,0,len);
			}
			out.close();
			fileInputStream.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
	}

后记

代码分为三部分,第一部分生成二维码,如果只需要二维码,第一部分就足够了,第二部分是绘制外边绿色边框和文字,第三部分是下载图片。

最终图片
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值