首页 > 编程语言 >JAVA-EE使用谷歌的ZXing实现生成带LOGO的QR Code------JAVA-EE

JAVA-EE使用谷歌的ZXing实现生成带LOGO的QR Code------JAVA-EE

时间:2024-01-05 11:32:04浏览次数:24  
标签:QR JAVA 缩放 EE int 二维码 LOGO import servlet

package com.powernode.qrcode.servlet;
 
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 jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;
 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
 
@WebServlet("/generateWithLogo")
//fileSizeThreshold文件大小达到后自动上传
//maxFileSize最大文件大小
//maxRequestSize最大请求大小
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 10,maxFileSize = 1024 * 1024 * 10,maxRequestSize = 1024 * 1024 * 10)
public class GenerateWithLogo extends HttpServlet
{
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        获取文本内容
        String url = request.getParameter("url");
        try{
//        使用谷歌提供的ZXING
//        需要创建一个Map集合存储二维码相关的属性
            Map map = new HashMap();
//        设置二维码的误差校正级别
//        可选值如下L(7%),M(15%),Q(25%),H(30%)
//        容错率越高消耗资源越多
            map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//        设置二维码的字符集
            map.put(EncodeHintType.CHARACTER_SET,"UTF-8");
//        设置二维码的四周留白
            map.put(EncodeHintType.MARGIN,1);
//        创建ZXING核心对象
//        通过这个对象来生成二维码
            MultiFormatWriter writer = new MultiFormatWriter();
//        需要的参数如下,内容,什么格式的二维码,二维码宽度,二维码高度,二维码参数
//        BarcodeFormat翻译为条形码格式,通过这个对象来设置格式
//        如QrCode二维码,具有数据密度高可靠性强的特点
//        AztecCode高密度可靠性强低容错率更小的尺寸,更高的效率(常用于个人信息账号信息,个人密码)
//        PDF417是一种储存大量信息的二维码格式(用于航空机票,运输配送,法律文件等)
//        DataMatrix是一种小巧的二维码格式,编码方式类似于QrCode二维码,但是可靠性识别率扫描速度都更优秀,尺寸小,可靠性高,因此多用于嵌入简单的产品标签
//        医疗图像监测数据等方面
            BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);
//        返回一个位矩阵对象(对象内部其实是一个二维数组,二维数组中每一个元素是Boolean类型,true代表黑色,false代表白色)
//            获取矩阵的宽度
            int width = bitMatrix.getWidth();
//            获取矩阵的高度
            int height = bitMatrix.getHeight();
//            生成二维码图片
//            这个对象是awt.image包下的专门用来生成图片的缓冲对象
            BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//            编写一个嵌套循环,遍历二维数组的循环,遍历这个位矩阵对象
            for (int x = 0; x < width; x++) {
//                按这个矩阵的高度和宽度遍历一遍
                for (int y = 0; y < height; y++) {
//                    0xFF000000是黑色,0xFFFFFFFF是白色
                    image.setRGB(x,y,bitMatrix.get(x,y) ? 0xFF000000 : 0xFFFFFFFF);
                }
            }
//            给二维码添加LOGO
//            将LOGO缩放
//            每一个文件我们都叫做一个part对象
            Part logo = request.getPart("logo");
//            获取我们前端上传的图片文件的输入流
            InputStream inputStream = logo.getInputStream();
//            通过IO流读取的方式将图片以流的形式获取
            Image logoImage = ImageIO.read(inputStream);
//            对获取到的图片进行缩放
            int logoWidth = logoImage.getWidth(null);
            int logoHeight = logoImage.getHeight(null);
            if (logoWidth > 60) {
                logoWidth = 60;
            }
            if (logoHeight > 60) {
                logoHeight = 60;
            }
//            这一段代码用来实现缩放
//            使用平滑缩放算法对原始LOGO图像进行缩放得到新的图像
            Image scaledInstance = logoImage.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);
//            第二部分将缩放完成的LOGO放到二维码上
//            获取2D画笔
            Graphics2D graphics = image.createGraphics();
//            指定开始坐标和X和Y
            int x = (300 - logoWidth) / 2;
            int y = (300 - logoHeight) / 2;
//            将缩放之后的LOGO放上去
            graphics.drawImage(scaledInstance,x,y,null);
//            创建一个具有指定位置,高度,圆角半径的圆角矩形,用它来绘制图片的边框
            Shape shape = new RoundRectangle2D.Float(x,y,logoWidth,logoHeight,10,10);
//            使用一个宽度为4像素的基本笔触
            graphics.setStroke(new BasicStroke(4f));
//            给LOGO画上圆角矩形
            graphics.draw(shape);
//            关闭画笔
            graphics.dispose();
//            将图片响应回到客户端,Tomcat会自动关闭这个流
            ImageIO.write(image,"PNG",response.getOutputStream());
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/generateWithLogo" method="post" enctype="multipart/form-data">
        请输入文本内容:<input type="text" name="url"/><br>
        请选择图片:<input type="file" name="logo"/><br>
        <hr>
        <input type="submit" value="生成二维码"/>
    </form>
</body>
</html>

标签:QR,JAVA,缩放,EE,int,二维码,LOGO,import,servlet
From: https://blog.51cto.com/u_16322355/9111808

相关文章

  • Apache Commons BCEL与Java字节码操作
    第1章:ApacheCommonsBCEL简介大家好,我是小黑,咱们今天来聊聊ApacheCommonsBCEL(ByteCodeEngineeringLibrary)。你可能会问,BCEL是什么鬼?别急,小黑这就给你娓娓道来。BCEL,它是一款专门用来操作Java字节码的库。想象一下,Java代码编译后变成了字节码,这些字节码是Java虚拟机执行的......
  • java基础语法API之GUI和时间类综合练习
    一:概述在这里将以两个小案例,去再次说明一个GUI和时间类的应用。二:具体案例<1>案例1:员工出勤查询在这里面需要最先写入一个DateChooser类,练习的时候可以直接复制这个代码,这个代码比较复杂。这个类是第一个代码块/*日期选择器,可以选择日期的显示格式*/importjavax.swing.*;imp......
  • Java之字符流的详细解析
     3.字符流当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。3.1字符输入流【Reader】java.io.Reader抽象类是表示用于......
  • Java项目管理工具 - Maven的使用
    Maven介绍什么是MavenMaven的正确发音是[ˈmevən],而不是“马瘟”以及其他什么瘟。Maven在美国是一个口语化的词语,代表专家、内行的意思。一个对Maven比较正式的定义是这么说的:Maven是一个项目管理工具,它包含了一个项目对象模型(POM:ProjectObjectModel),一组标准集合,一个......
  • 关于JavaScript的技巧一
    1.滚动到页面顶部我们可以使用window.scrollTo()平滑滚动到页面顶部。constscrollToTop=()=>{window.scrollTo({top:0,left:0,behavior:"smooth"});};2.滚动到页面底部当然,如果知道文档的高度,也可以平滑滚动到页面底部。constscrollToBottom=()=>{wind......
  • "ManageEngine荣获Gartner SIEM客户选择四连冠"
    我们非常激动地宣布,ManageEngine已经连续第四次被认定为GartnerPeerInsights‘VoiceoftheCustomer’:安全信息与事件管理(SIEM)中的客户选择。这不仅是对我们卓越SIEM解决方案承诺的肯定,也延续了ManageEngine在行业的声望。同时,我们还连续六次被认定为2023年Gartner®MagicQuad......
  • Python实现post请求虾皮shopee商品列表API
    Shopee平台商品列表数据接口是一种用于获取Shopee平台上商品列表信息的API接口。通过调用该接口,用户可以获取到商品的基本信息,如商品ID、商品名称、商品价格等。以下是一个示例的Shopee平台商品列表数据接口的请求和返回示例:Shopee.item_search-获取虾皮商品列表数据接口返回值说明......
  • Oracle Database 23c Free - Developer Release 免费的 Oracle 数据库开发者版本下载
    免费的Oracle数据库开发者版本作者主页:sysin.orgOracleDatabase23cFree-DeveloperRelease是一个全新的、免费的、业界领先的Oracle数据库,全世界各个行业的企业每天都在使用它。无需oracle.com帐户即可下载,可以通过这个世界领先的简单、快速的融合数据库,支持所有数据模......
  • 深入分析 Java、Kotlin、Go 的线程和协程
    文章目录前言协程是什么协程的好处进程进程是什么进程组成进程特征线程线程是什么线程组成任务调度进程与线程的区别线程的实现模型一对一模型多对一模型多对多模型线程的“并发”协程协程的目的协程的特点协程的原理Java、Kotlin、Go的线程与协程Kotlin的协程使用「线程」的代......
  • VUE3 + Three.js 坑
    VUE3+Three.js坑1.问题描述将scene、camera、renderer、controls等变量用reactive变成响应式时,页面渲染会报错:three.module.js?5a89:24471UncaughtTypeError:'get'onproxy:property'modelViewMatrix'isaread-onlyandnon-configurabledatapropertyontheprox......