当前位置:网站首页>如何生成二维码图片(添加中文标识),并保存到指定的图片静态服务地址,解决二维码汉字不存在得问题。

如何生成二维码图片(添加中文标识),并保存到指定的图片静态服务地址,解决二维码汉字不存在得问题。

2022-06-09 19:00:00 _王小义_

在开发过程中会有遇到链接转成二维码的需求,明确了链接的拼接内容之后,我们就可以着手写二维码的生成了

导入生成二维码需要的依赖,

	<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>

书写实现类,为了区分二维码,我们在图片下方添加了对应的汉字作为标识。

@Service
@Slf4j
public class QrCodeGeneratorServiceImpl implements IQrCodeGenertorService {
    

    private int WIDTH = 350;
    private int HEIGHT = 350;
    private String SUFFIX = "png";
    private String IMG_SUFFIX = ".png";
    @Value("${qr.code.path}")
    private String filePath;
    @Value("${qr.code.url}")
    private String url;

    @Override
    public String getQrCodeImage(CollectQrImageParams imageParams) {
    
        try {
    
            String pointId = imageParams.getUuid();
            String pointName = imageParams.getPointName();
            String qrUrl = url+"?pointId="+ pointId;
            String simpleUuid = UUIDUtil.simpleUuid();
            String fileName = simpleUuid + IMG_SUFFIX;
            String pathName =   filePath + fileName;
            generateQRCodeImage(qrUrl, pointName, pathName, WIDTH, HEIGHT);
            return pathName;
        } catch (WriterException e) {
    
            log.error("Could not generate QR Code, WriterException :: " + e.getMessage());
        } catch (IOException e) {
    
            log.error("Could not generate QR Code, IOException :: " + e.getMessage());
        }
        return "fail";
    }

    private void generateQRCodeImage(String qrCodeContent, String pngName, String pathName, int width, int height) throws WriterException,
            IOException {
    
       try{
    
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            BitMatrix bitMatrix = qrCodeWriter.encode(qrCodeContent, BarcodeFormat.QR_CODE, width, height);
			//存储在存储中,地址不存在则新建
            File dest = new File(pathName);
            if (!dest.getParentFile().exists()) {
    
                dest.getParentFile().mkdirs();
            }
            BufferedImage image = toBufferedImage(bitMatrix);
            if(pngName!=null) {
    
                pressText(pngName, image);
            }
            //将图片写入存储中(图片服务器)
            ImageIO.write(image,SUFFIX, dest);
            log.info("生成二维码成功,pathName={}", pathName);
        } catch (Exception e) {
    
            e.printStackTrace();
            log.error("Can not generate QR code picture. {}"+ e.getMessage());
        }
    }

    /** * 转换二维码的图片为buffered * @param matrix * @return */
    private static BufferedImage toBufferedImage(BitMatrix matrix) {
    
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        for (int x = 0; x < width; x++) {
    
            for (int y = 0; y < height; y++) {
    
                image.setRGB(x, y, matrix.get(x, y) == true ? BLACK : WHITE);
            }
        }
        return image;
    }

    /** * 给二维码图片加上文字 */
    public void pressText(String pressText, BufferedImage image) throws IOException {
    
        pressText = new String(pressText.getBytes(), "utf-8");
        Graphics g = image.createGraphics();
        g.setColor(Color.BLACK);
        Font font = new Font("宋体", Font.PLAIN, 20);
        FontMetrics metrics = g.getFontMetrics(font);
        // 文字在图片中的坐标 这里设置在中间
        int startX = (WIDTH - metrics.stringWidth(pressText)) / 2;
        int startY = HEIGHT - 20;
        g.setFont(font);
        g.drawString(pressText, startX, startY);
        g.dispose();
    }
}

在代码部署到linux服务器后,会有发现生成的二维码中的汉字显示方框,这时候不是代码有问题,而可能是生成所需要的字体不存在,

  1. 进入服务器验证下字体的存在,/usr/share/fonts目录下查看,如果没有fonts目录的话就创建一下,有的话就检查有没有宋体的字体。

  2. 进入C:\Windows\Fonts 查找我们需要的宋体,之后上传到服务器上/usr/share/fonts/winfont,

  3. 在此目录下执行linux命令“fc-cache -fv”,扫描字体目录并生成字体信息的缓存,然后应用程序就可以"立即"使用这些新安装的字体。

  4. 重启应用即可验证。

原网站

版权声明
本文为[_王小义_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/haobindayi/article/details/125174410