精华内容
下载资源
问答
  • 生成带logo的二维码图片,已测试

    package com.ErWeiMaCenterPic;

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Objects;

    import javax.imageio.ImageIO;

    import org.apache.commons.lang3.StringUtils;

    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 com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    /**

    • 制定带logo和带描述的二维码

    • @author fengwen
      */
      public class ErWeiMaCenterPic {
      private static final int QRCOLOR = 0xFF000000; // 默认是黑色
      private static final int BGWHITE = 0xFFFFFFFF; // 背景颜色

      private static final int WIDTH = 400; // 二维码宽
      private static final int HEIGHT = 400; // 二维码高
      // 用于设置QR二维码参数
      private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
      private static final long serialVersionUID = 1L;
      {
      put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 设置QR二维码的纠错级别,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
      put(EncodeHintType.CHARACTER_SET, “utf-8”);// 设置编码方式
      put(EncodeHintType.MARGIN, 0);//设置二维码边框
      }
      };
      //测试主方法,已调试成功
      public static void main(String[] args) throws WriterException {
      File logoFile = new File(“D://ERWEIMA/logo.jpg”);
      File QrCodeFile = new File(“D://ERWEIMA/QrCode.png”);
      String url = “https://www.baidu.com/”;
      String note = “访问百度连接”;
      drawLogoQRCode(logoFile, QrCodeFile, url, note);
      }

      // 生成带logo的二维码图片
      public static void drawLogoQRCode(File logoFile, File codeFile, String qrUrl, String note) {
      try {
      MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
      // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
      BitMatrix bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
      BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

           // 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
           for (int x = 0; x < WIDTH; x++) {
               for (int y = 0; y < HEIGHT; y++) {
                   image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
               }
           }
           
           //1.构建logo图片
           int width = image.getWidth();
           int height = image.getHeight();
           if (Objects.nonNull(logoFile) && logoFile.exists()) {
               // 构建绘图对象
               Graphics2D g = image.createGraphics();
               // 读取Logo图片
               BufferedImage logo = ImageIO.read(logoFile);
               // 开始绘制logo图片
               g.drawImage(logo, width * 2 / 5, height * 2 / 5, width * 2 / 10, height * 2 / 10, null);
               g.dispose();
               logo.flush();
           }
      
           // 自定义文本描述
           if (StringUtils.isNotEmpty(note)) {
               // 新的图片,把带logo的二维码下面加上文字
               BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);
               Graphics2D outg = outImage.createGraphics();
               // 画二维码到新的面板
               outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
               // 画文字到新的面板
               outg.setColor(Color.BLUE);
               outg.setFont(new Font("楷体", Font.BOLD, 30)); // 字体、字型、字号
               int strWidth = outg.getFontMetrics().stringWidth(note);
               if (strWidth > 399) {
                   //长度过长就截取前面部分,长度过长就换行
                   String note1 = note.substring(0, note.length() / 2);
                   String note2 = note.substring(note.length() / 2, note.length());
                   int strWidth1 = outg.getFontMetrics().stringWidth(note1);
                   int strWidth2 = outg.getFontMetrics().stringWidth(note2);
                   outg.drawString(note1, 200 - strWidth1 / 2, height + (outImage.getHeight() - height) / 2 + 12);
                   BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);
                   Graphics2D outg2 = outImage2.createGraphics();
                   outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);
                   outg2.setColor(Color.BLACK);
                   outg2.setFont(new Font("宋体", Font.BOLD, 30)); // 字体、字型、字号
                   outg2.drawString(note2, 200 - strWidth2 / 2,outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight()) / 2 + 5);
                   outg2.dispose();
                   outImage2.flush();
                   outImage = outImage2;
               } else {
                   outg.drawString(note, 200 - strWidth / 2, height + (outImage.getHeight() - height) / 2 + 12); // 画文字
               }
               outg.dispose();
               outImage.flush();
               image = outImage;
           }
      
           image.flush();
      
           ImageIO.write(image, "png", codeFile); 
       } catch (Exception e) {
           e.printStackTrace();
       }
      

      }
      }

    展开全文
  • java生成二维码

    2018-09-14 09:44:27
    java生成二维码带说明书!提供生成原始二维码,带图片二维码
  • java生成二维码图片

    2021-04-02 10:16:09
    java生成二维码图片 **工具类描述: ​ java生成有自定义信息二维码图片,可以根据自己的具体需求进行修改 运行效果如下: 文件名: CSDN.jpg 扫码后的结果如下: ​ 生成二维码图片的方法如下: public static void ...

    java生成二维码图片

    **工具类描述:

    java生成带有自定义信息二维码图片,可以根据自己的具体需求进行修改

    运行效果如下:在这里插入图片描述

    文件名: CSDN.jpg

    扫码后的结果如下:

    在这里插入图片描述

    生成二维码图片的方法如下:

    public static void main(String[] args) throws IOException {
            encodeImage("D:\\CSDN论坛相关","CSDN_001","CSDN最棒","CSDN专属","CSDN");
        }
    
    
    
        /**
         * 生成设备的二维码接口   
         *
         * @param pageNum
         * @param pageSize
         * @return
         */
        @ApiImplicitParams({
                @ApiImplicitParam(name = "filePath", value = "要将生成的二维码放到哪个文件夹: 必传", dataType = "String"),
                @ApiImplicitParam(name = "facilityId", value = "设备的id", dataType = "String"),
                @ApiImplicitParam(name = "facilityName", value = "设备的名称", dataType = "String"),
                @ApiImplicitParam(name = "facilityTypeMeaning", value = "设备的类型的含义", dataType = "String"),
                @ApiImplicitParam(name = "fileName", value = "生成二维码的文件名: 必传", dataType = "String"),
        })
        @ApiOperation(value = "生成设备的二维码接口", notes = "生成设备的二维码接口说明")
        @ApiOperationSupport(
                responses = @DynamicResponseParameters(properties = {
                        @DynamicParameter(value = "返回码", name = "code"),
                        @DynamicParameter(value = "返回消息", name = "message"),
                        @DynamicParameter(value = "返回内容", name = "data", dataTypeClass = JsonResult.class)
                })
        )
        @RequestMapping(value = "/encodeImage", method = RequestMethod.POST)
        @ResponseBody
        public static JsonResult encodeImage(
                @RequestParam(value = "filePath", required = true) String filePath,           // 要将生成的二维码放到哪个文件夹
                @RequestParam(value = "facilityId", required = true) String facilityId,             // 生成二维码中要存储的信息
                @RequestParam(value = "facilityName", required = true) String facilityName,             // 生成二维码中要存储的信息
                @RequestParam(value = "facilityTypeMeaning", required = true) String facilityTypeMeaning,             // 生成二维码中要存储的信息
                @RequestParam(value = "fileName", required = true) String fileName          // 生成二维码的文件名
        ) throws IOException {
    
            String qrData = facilityId + "&&" + facilityName + "&&" + facilityTypeMeaning;       //  TODO 固定格式:   1&&测试设备名称1&&水泵
    
            Qrcode qrcode = new Qrcode();
            qrcode.setQrcodeErrorCorrect('M');//纠错等级(分为L、M、H三个等级)
            qrcode.setQrcodeEncodeMode('B');//N代表数字,A代表a-Z,B代表其它字符
            qrcode.setQrcodeVersion(10);//版本
            //生成二维码中要存储的信息
            //String qrData ="机械设备二";
            //设置一下二维码的像素
            int width = 67 + 12 * (10 - 1);
            int height = 67 + 12 * (10 - 1);
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //绘图
            Graphics2D gs = bufferedImage.createGraphics();
            gs.setBackground(Color.WHITE);
            gs.setColor(Color.BLACK);
            gs.clearRect(0, 0, width, height);//清除下画板内容
            //设置下偏移量,如果不加偏移量,有时会导致出错。
            int pixoff = 2;
            byte[] d = qrData.getBytes("gb2312");
            if (d.length > 0 && d.length < 120) {
                boolean[][] s = qrcode.calQrcode(d);
                for (int i = 0; i < s.length; i++) {
                    for (int j = 0; j < s.length; j++) {
                        if (s[j][i]) {
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            }
            gs.dispose();
            bufferedImage.flush();
            //设置要存储的目录(这里存储在本地)
            ImageIO.write(bufferedImage, "jpg", new File(filePath +"\\" + fileName + ".jpg"));
            System.out.println("输出二维码成功");
            return new JsonResult(1, "生成二维码成功");
        }
    
    展开全文
  • java生成二维码,且中间带图片(logo)的方法,且logo的具体位置可以自己设置,下载下来就能运行的 java生成二维码,且中间带图片(logo)的方法,且logo的具体位置可以自己设置,下载下来就能运行的
  • --生成二维码--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-extra</artifactId> <version>5.4.3</version> </dependency> <...

    1pom.xml

    <!--生成二维码-->
    <dependency>
       <groupId>cn.hutool</groupId>
       <artifactId>hutool-extra</artifactId>
       <version>5.4.3</version>
    </dependency>
    <dependency>
       <groupId>com.google.zxing</groupId>
       <artifactId>core</artifactId>
       <version>3.3.3</version>
    </dependency>
    
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    2.工具类

    package com.example.QRcode.utils;
    
    import cn.hutool.extra.qrcode.QrCodeUtil;
    import cn.hutool.extra.qrcode.QrConfig;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    import org.springframework.core.io.DefaultResourceLoader;
    import org.springframework.core.io.ResourceLoader;
    import org.springframework.util.ResourceUtils;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * @Description: 在图片上生成二维码并且在图片上添加文字response前端
     * @Auther: yjj
     * @Date: 2020/9/23 18:57
     */
    public class QRcodeImageFont {
    
        /***
         * 在一张背景图上添加二维码
         */
        public static void drawString(String content, HttpServletResponse response) throws Exception {
            BufferedImage image = addWater(content);
            Graphics2D gd = image.createGraphics();
            // 3、设置对线段的锯齿状边缘处理
            gd.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            // 5、设置水印文字颜色
            gd.setColor(Color.red);
            // 6、设置水印文字Font
            gd.setFont(new Font("宋体", Font.BOLD, 20));
            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
            gd.drawString("测试文字", 90, 260);
            gd.dispose();
            // 输出图片
            ServletOutputStream outputStream = response.getOutputStream();
            ImageIO.write(image, "png",outputStream );
            System.out.println("添加水印完成");
            outputStream.flush();
            outputStream.close();
        }
    
        /***
         * 在一张背景图上添加二维码
         */
        public static BufferedImage addWater(String content) throws Exception {
            // 读取原图片信息
            //得到文件
            File file = ResourceUtils.getFile("classpath:static/img/code.png");
            //文件转化为图片
            Image srcImg = ImageIO.read(file);
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //使用工具类生成二维码
            Image image = createQrCode(content,200,200);
            //将小图片绘到大图片上,500,300 .表示你的小图片在大图片上的位置。
            g.drawImage(image, 70, 300, null);
            //设置颜色。
            g.setColor(Color.WHITE);
            g.dispose();
            return bufImg;
        }
    
        private static BufferedImage createQrCode(String content, int width, int height) throws IOException {
            QrConfig config = new QrConfig(width, height);
    
            Image image = ImageIO.read(resourceLoader("classpath:static/img/onlyLogo.png"));
            config.setImg(image);
            config.setErrorCorrection(ErrorCorrectionLevel.H);
            return QrCodeUtil.generate(
                    content,
                    config);
        }
    
        public static InputStream resourceLoader(String fileFullPath) throws IOException {
            ResourceLoader resourceLoader = new DefaultResourceLoader();
            return resourceLoader.getResource(fileFullPath).getInputStream();
        }
    }

    3.底图和logo

     

    4.测试

    package com.example.QRcode.controller;
    
    import com.example.QRcode.utils.QRcodeImageFont;
    import com.example.QRcode.utils.QRcodeImageUtils;
    import com.example.QRcode.utils.QRcodeUtils;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @Description:
     * @Auther: yjj
     * @Date: 2020/9/23 18:58
     */
    @RestController
    @RequestMapping(value = "/test")
    public class TestController {
    
        @GetMapping("/createQrCode")
        public void createQrCode(@RequestParam("url") String url, HttpServletResponse response) throws Exception {
           
            //在图片上生成二维码,并在图片上添加文字描述
            QRcodeImageFont.drawString(url,response);
        }
    }

    5.展示

    展开全文
  • java 生成二维码

    2015-06-08 18:21:27
    java生成二维码源码,生成图片分析
  • jsp生成二维码带图片

    2016-11-09 17:53:42
    jsp生成二维码带图片Java项目
  • 使用的架包是QRCode,可以生成普通的二维码带图片二维码
  • java 生成二维码(QRCode)图片 ,包括logo,底部文字,压缩图片
  • java 二维码带图片生成,有解析二维码和生成二维码的代码,可以直接使用,很方便
  • 使用zxing和hutool包来生成二维码,使用BufferedImage和Graphics2D来绘制图片 <dependencies> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</...

    使用zxing和hutool包来生成二维码,使用BufferedImage和Graphics2D来绘制图片

        <dependencies>
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>core</artifactId>
                <version>3.4.1</version>
            </dependency>
    
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.5.6</version>
            </dependency>
        </dependencies>

    主要代码

    package com.tgpms.web.tongfei.utils;
    
    import cn.hutool.core.util.StrUtil;
    import cn.hutool.extra.qrcode.QrCodeUtil;
    import cn.hutool.extra.qrcode.QrConfig;
    import sun.misc.BASE64Encoder;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
    
    /**
     * @Author: jiangli
     * @Date: 2021/1/6 16:37
     * 合成二维码工具类
     */
    public class QrCoder {
    
        /**
         * 图片的宽度
         */
        private static final int IMAGE_WIDTH = 350;
        /**
         * 图片的高度(需按实际内容高度进行调整)
         */
        private static final int IMAGE_HEIGHT = 350;
        /**
         * 二维码的宽度
         */
        private static final int QR_CODE_WIDTH = 150;
        /**
         * 二维码的宽度
         */
        private static final int QR_CODE_HEIGHT = 150;
    
        private static final String FORMAT_NAME = "JPG";
    
        /**
         * @param imgLogo logo图片
         * @param title   头部标题
         * @param content 内容
         * @param footer  底部文字
         */
        public static BufferedImage createQrCode(String imgLogo, String title, String content, String footer) {
            // 头部文字区域高度
            int titleHeight = 50;
    
            // 创建主模板图片
            BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
            Graphics2D main = image.createGraphics();
            // 设置图片的背景色
            main.setColor(Color.white); //白色
            main.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
    
            // 动态高度
            int height = 0;
    
            //***********************页面头部 文字****************
            Graphics2D titleRight = image.createGraphics();
            // 设置字体颜色 black黑 white白
            titleRight.setColor(Color.black);
            // 设置字体
            Font titleFont = new Font("宋体", Font.BOLD, 25);
            titleRight.setFont(titleFont);
            titleRight.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            // 居中 x开始的位置:(图片宽度-字体大小*字的个数)/2
            int x = (IMAGE_WIDTH - (titleFont.getSize() * title.length())) / 2;
            titleRight.drawString(title, x, (titleHeight) / 2 + 10);
            height += titleHeight;
    
            //**********************中间文字部分*********
            Graphics2D centerWord = image.createGraphics();
            // 设置字体颜色,先设置颜色,再填充内容
            centerWord.setColor(Color.black);
            // 设置字体
            Font wordFont = new Font("宋体", Font.PLAIN, 15);
            centerWord.setFont(wordFont);
            centerWord.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            String[] info = content.split("-");
            for (String s : info) {
                // x开始的位置:(图片宽度-字体大小*字的个数)/2
                int strWidth = centerWord.getFontMetrics().stringWidth(s);
                // 总长度减去文字长度的一半  (居中显示)
                int startX = (IMAGE_WIDTH - strWidth) / 2;
                height += 20;
                centerWord.drawString(s, startX, height);
            }
    
            //***************插入二维码图片***********************************************
            Graphics codePic = image.getGraphics();
            BufferedImage codeImg;
            QrConfig config = new QrConfig();
            config.setWidth(QR_CODE_WIDTH);
            config.setHeight(QR_CODE_HEIGHT);
            if (StrUtil.isNotBlank(imgLogo)) {
                config.setImg(imgLogo);
            }
            codeImg = QrCodeUtil.generate(content, config);
            // 绘制二维码
            codePic.drawImage(codeImg, (IMAGE_WIDTH - QR_CODE_WIDTH) / 2, height, QR_CODE_WIDTH, QR_CODE_HEIGHT, null);
            codePic.dispose();
    
            //**********************底部公司名字*********
            Graphics2D typeLeft = image.createGraphics();
            // 设置字体颜色
            typeLeft.setColor(Color.black);
            // 设置字体
            Font footerFont = new Font("宋体", Font.PLAIN, 10);
            typeLeft.setFont(footerFont);
            typeLeft.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            // x开始的位置:(图片宽度-字体大小*字的个数)/2
            int startX = (IMAGE_WIDTH - (footerFont.getSize() * footer.length())) / 2;
            height += QR_CODE_HEIGHT;
            typeLeft.drawString(footer, startX, height);
    
            //***************插入标志图片***********************************************
    //        Graphics signPic = image.getGraphics();
    //        BufferedImage signImg = null;
    //        try {
    //            signImg = ImageIO.read(new java.io.File(imgSign));
    //        } catch (Exception e) {
    //        }
    //
    //        if (signImg != null) {
    //            signPic.drawImage(signImg, 0, 130, QR_CODE_WIDTH, QR_CODE_HEIGHT, null);
    //            signPic.dispose();
    //        }
            // 返回image方便后续处理是生成图片还是生成base64字符串
            return image;
        }
    
        // 生成图片文件
        public static void createImage(BufferedImage image, String fileLocation) {
            if (image != null) {
                try {
                    ImageIO.write(image, "png", new File(fileLocation));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 获取图片base64数据
        public static String base64ImageString(BufferedImage image) throws IOException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();//io流
            ImageIO.write(image, FORMAT_NAME, bos);//写入流中
            byte[] bytes = bos.toByteArray();//转换成字节
            BASE64Encoder encoder = new BASE64Encoder();
            String jpgBase64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
            jpgBase64 = jpgBase64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
            return "data:image/jpg;base64," + jpgBase64;
        }
    
        public static void main(String[] args) {
            String content = "汇丰管业-HDPE节流式缠绕增强管-DN300-20210101-A001-0821001-080901000001";
            BufferedImage bufferedImage = createQrCode(null, "物资模块", content, "三峡科技有限公司");
            createImage(bufferedImage, "D:/test.png");
        }
    
    }

    效果图

    补充:如果要content的文字从左到右从上到下显示, 可以参考下面的方法, 主要是计算文字宽度和高度进行换行

    package com.tgpms.utils;
    
    import cn.hutool.core.collection.CollectionUtil;
    import cn.hutool.core.util.StrUtil;
    import cn.hutool.extra.qrcode.QrCodeUtil;
    import cn.hutool.extra.qrcode.QrConfig;
    import org.apache.commons.codec.binary.Base64;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    /**
     * @author jiangli
     * @since 2021/1/6 16:37
     * 合成二维码工具类
     */
    public class QrCoder {
    
        // 用来调整水印的间距
        private static final int space = 2;
    
        /**
         * 图片的宽度
         */
        private static final int IMAGE_WIDTH = 150;
        /**
         * 图片的高度(需按实际内容高度进行调整)
         */
        private static final int IMAGE_HEIGHT = 300;
        /**
         * 二维码的宽度
         */
        private static final int QR_CODE_WIDTH = 150;
        /**
         * 二维码的高度
         */
        private static final int QR_CODE_HEIGHT = 150;
    
        private static final String FORMAT_NAME = "JPG";
    
        /**
         * @param imgLogo logo图片
         * @param title   头部标题
         * @param content 内容
         * @param footer  底部文字
         */
        public static BufferedImage createQrCode(String imgLogo, String title, String content, String footer) {
            // 头部文字区域高度
            int titleHeight = 50;
    
            // 创建主模板图片
            BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
            Graphics2D main = image.createGraphics();
            // 设置图片的背景色
            main.setColor(Color.white); //白色
            main.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
    
            // 动态高度
            int height = 0;
    
            //***********************页面头部 文字****************
            Graphics2D titleRight = image.createGraphics();
            // 设置字体颜色 black黑 white白
            titleRight.setColor(Color.black);
            // 设置字体
            Font titleFont = new Font("宋体", Font.BOLD, 18);
            titleRight.setFont(titleFont);
            titleRight.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            // 居中 x开始的位置:(图片宽度-字体大小*字的个数)/2
            int x = (IMAGE_WIDTH - (titleFont.getSize() * title.length())) / 2;
            titleRight.drawString(title, x, (titleHeight) / 2 + 10);
            height += titleHeight;
    
            //**********************中间文字部分*********
            Graphics2D centerWord = image.createGraphics();
            // 设置字体颜色,先设置颜色,再填充内容
            centerWord.setColor(Color.black);
            // 设置字体
            Font wordFont = new Font("宋体", Font.PLAIN, 14);
            centerWord.setFont(wordFont);
            centerWord.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
    
            String words = content.substring(0, content.lastIndexOf("-"));
            List<String> waterMarkContents = Collections.singletonList(words);
            java.util.List<String> waterMarkContentList = new ArrayList<>();
            // 获取字符高度
            int strHeight = getStringHeight(centerWord);
            // 将换行后的文字放入新的集合
            for (String markContent : waterMarkContents) {
                // 单字符长度
                int tempCharLen = 0;
                // 单行字符总长度临时计算
                int tempLineLen = 0;
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < markContent.length(); i++) {
                    char tempChar = markContent.charAt(i);
                    tempCharLen = getCharLen(tempChar, centerWord);
                    tempLineLen += tempCharLen;
                    // 文字长度大于图片宽度-2*间距-字体大小
                    if (tempLineLen > IMAGE_WIDTH - space * 2 - tempCharLen) {
                        // 长度已经满一行
                        waterMarkContentList.add(sb.toString());
                        // 清空内容,重新追加
                        sb.delete(0, sb.length());
                        tempLineLen = 0;
                    }
                    // 追加字符
                    sb.append(tempChar);
                }
                waterMarkContentList.add(sb.toString());
            }
            // 绘制内容文字
            if (CollectionUtil.isNotEmpty(waterMarkContentList)) {
                for (int i = 0; i < waterMarkContentList.size(); i++) {
                    String s = waterMarkContentList.get(i);
                    if (i > 0) {
                        //第一行不需要增加字符高度,以后的每一行在换行的时候都需要增加字符高度
                        height += strHeight;
                    }
                    centerWord.drawString(s, space, height);
                }
            }
    
            //***************插入二维码图片***********************************************
            Graphics codePic = image.getGraphics();
            BufferedImage codeImg;
            QrConfig config = new QrConfig();
            config.setMargin(0);
            config.setWidth(QR_CODE_WIDTH);
            config.setHeight(QR_CODE_HEIGHT);
            if (StrUtil.isNotBlank(imgLogo)) {
                config.setImg(imgLogo);
            }
            codeImg = QrCodeUtil.generate(content, config);
            // 绘制二维码
            codePic.drawImage(codeImg, (IMAGE_WIDTH - QR_CODE_WIDTH) / 2, height, QR_CODE_WIDTH, QR_CODE_HEIGHT, null);
            codePic.dispose();
    
            //**********************底部公司名字*********
            if (StrUtil.isNotBlank(footer)) {
                Graphics2D typeLeft = image.createGraphics();
                // 设置字体颜色
                typeLeft.setColor(Color.black);
                // 设置字体
                Font footerFont = new Font("宋体", Font.PLAIN, 10);
                typeLeft.setFont(footerFont);
                typeLeft.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
                // x开始的位置:(图片宽度-字体大小*字的个数)/2
                int startX = (IMAGE_WIDTH - (footerFont.getSize() * footer.length())) / 2;
                // 获取字符高度
                int footerStrHeight = getStringHeight(typeLeft);
                height += QR_CODE_HEIGHT + footerStrHeight;
                typeLeft.drawString(footer, startX, height);
            }
    
            //***************插入标志图片***********************************************
    //        Graphics signPic = image.getGraphics();
    //        BufferedImage signImg = null;
    //        try {
    //            signImg = ImageIO.read(new java.io.File(imgSign));
    //        } catch (Exception e) {
    //        }
    //
    //        if (signImg != null) {
    //            signPic.drawImage(signImg, 0, 130, QR_CODE_WIDTH, QR_CODE_HEIGHT, null);
    //            signPic.dispose();
    //        }
            // 返回image方便后续处理是生成图片还是生成base64字符串
            return image;
        }
    
        // 获取图片base64数据
        public static String base64ImageString(BufferedImage image) throws IOException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();//io流
            ImageIO.write(image, FORMAT_NAME, bos);//写入流中
            byte[] bytes = bos.toByteArray();//转换成字节
            String jpgBase64 = new String(Base64.encodeBase64(bytes)).trim();//转换成base64串
            jpgBase64 = jpgBase64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
            return "data:image/jpg;base64," + jpgBase64;
        }
    
        // 字符串总宽度
        private static int getStringLength(Graphics g, String str) {
            char[] chars = str.toCharArray();
            return g.getFontMetrics().charsWidth(chars, 0, str.length());
        }
    
        // 字符高度
        private static int getStringHeight(Graphics g) {
            return g.getFontMetrics().getHeight();
        }
    
        // 每一行字符的个数
        private static int getRowStrNum(int strNum, int rowWidth, int strWidth) {
            return (rowWidth * strNum) / strWidth;
        }
    
        // 字符行数
        private static int getRows(int strWidth, int rowWidth) {
            int rows;
            if (strWidth % rowWidth > 0) {
                rows = strWidth / rowWidth + 1;
            } else {
                rows = strWidth / rowWidth;
            }
            return rows;
        }
    
        public static int getCharLen(char c, Graphics2D g) {
            return g.getFontMetrics(g.getFont()).charWidth(c);
        }
    
        /**
         * 获取水印文字总长度
         *
         * @param waterMarkContent 水印的文字
         * @param g                绘图方法
         * @return 水印文字总长度
         */
        public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
            return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
        }
    
    }
    
            List<BufferedImage> images = new ArrayList<>();
            for (MaterialDetail detail : list) {
                StringJoiner sj = new StringJoiner("-");
                // 供货厂商-物资名称-规格-日期(yyyyMMdd)-流水号 -批号-物资编码
                String content = sj.add(detail.getSupplierAr()).add(detail.getName()).add(detail.getModel())
                        .add(detail.getDeliveryDate()).add(detail.getSort()).add(detail.getBatchNo()).add(detail.getMaterialNo()).toString();
                BufferedImage image = QrCoder.createQrCode(null, cwp, content, "三峡科技有限公司");
                images.add(image);
            }
            ImageToPdfUtil.downloadPdf(images, response);

    展开全文
  • 主要使用了goole的zxing包,生成二维码比较简单,在常规二维码的基础上封装了可以在二维码中间添加图片的功能,代码都属于初步框架,功能有了,需要根据实际使用情况完善优化。效果图:源码如下:packagecom.thatway....
  • 通过java生成二维码首先下载谷歌提供的两个jar 链接:https://pan.baidu.com/s/1ZrNXHaUNnfuiADM4D4VOvQ 提取码:0hn5 然后自定义类 public class QrCodeUtil { //生成二维码图片输出流 private static ...
  • java生成二维码,中间可带图片logo
  • java生成二维码demo

    2017-01-05 11:41:23
    内含生成二维码的一个案例,可生成带图片带参数的二维码。
  • 修改图片存放地址及icon地址直接能用。 包含TwoDimensionCode.java、TwoDimensionCodeImage.java、QRCode.jar
  • java生成二维码工具类,包括生成二维码,生成logo二维码,图片嵌套图片,二维码嵌套到大图中等等功能。
  • java生成二维码logo)

    千次阅读 2015-06-28 17:48:22
    之前写过一篇不logo的二维码实现方式,采用QRCode和ZXing两种方式 ...这里介绍一下ZXing的logo实现方式,具体实现参考一下代码,测试使用...视频链接地址稍后更新,视频地址中包含图片二维码流输出方式 LogoCon
  • java生成二维码有logo和文字)

    千次阅读 2018-06-01 09:29:30
    * 根据自定义的内容和图片名称生成二维码图片 * 参考:https://blog.csdn.net/amberwangfeng/article/details/78657889 */ public static void main(String[] args ){ String content = "...
  • Java生成二维码后,带logo图片时,需要在新生成的二维码图片中,画对应的logo;带备注信息时,需要先准备一张画布,将画布分为二维码信息和备注信息两部分,一部分画二维码信息,一部分写备注信息。   二维码带...
  • java生成中间带图片二维码的工具类。
  • 在配置文件中简单的配置二维码的信息,即可生成带指定logo图片二维码二维码内容颜色自定义
  • 生成“名片式(有背景图片、用户网络头像、用户名称的二维码图片)的二维码

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 195
精华内容 78
关键字:

java生成二维码带图片

java 订阅