-
Java生成二维码生成带logo图片
2020-01-22 21:22:37生成带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:27java生成二维码带说明书!提供生成原始二维码,带图片二维码 -
java生成二维码图片
2021-04-02 10:16:09java生成二维码图片 **工具类描述: 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) 的方法
2020-09-07 01:30:22java生成二维码,且中间带图片(logo)的方法,且logo的具体位置可以自己设置,下载下来就能运行的 java生成二维码,且中间带图片(logo)的方法,且logo的具体位置可以自己设置,下载下来就能运行的 -
java生成二维码(在图片上生成二维码(二维码带logo)并且在图片上添加文字标签)
2020-09-24 10:06:11--生成二维码--> <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:27java生成二维码源码,生成图片,带分析 -
jsp生成二维码带图片
2016-11-09 17:53:42jsp生成二维码带图片,Java项目 -
java生成二维码(带使用说明、可以生成带图片的二维码).rar
2015-09-17 12:16:23使用的架包是QRCode,可以生成普通的二维码和带图片的二维码 -
java中生成二维码带logo带底部文字带压缩图片
2017-09-30 15:11:00java 生成二维码(QRCode)图片 ,包括logo,底部文字,压缩图片 -
java 二维码带图片生成
2014-05-05 10:16:00java 二维码带图片生成,有解析二维码和生成二维码的代码,可以直接使用,很方便 -
java生成二维码带顶部底部文字说明
2021-01-04 21:06:36使用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);
-
java生成二维码,二维码中间可带图片
2013-07-23 11:42:06主要使用了goole的zxing包,生成二维码比较简单,在常规二维码的基础上封装了可以在二维码中间添加图片的功能,代码都属于初步框架,功能有了,需要根据实际使用情况完善优化。效果图:源码如下:packagecom.thatway.... -
java生成二维码(附带乱码解决方案)
2020-07-20 15:20:57通过java生成二维码首先下载谷歌提供的两个jar 链接:https://pan.baidu.com/s/1ZrNXHaUNnfuiADM4D4VOvQ 提取码:0hn5 然后自定义类 public class QrCodeUtil { //生成二维码图片输出流 private static ... -
java生成二维码(中间带logo)
2017-06-05 20:40:07用java来生成的二维码,中间可带图片logo -
java生成二维码demo
2017-01-05 11:41:23内含生成二维码的一个案例,可生成带图片带参数的二维码。 -
java生成二维码带中间logo含附属jar包
2013-11-07 13:41:45修改图片存放地址及icon地址直接能用。 包含TwoDimensionCode.java、TwoDimensionCodeImage.java、QRCode.jar -
java生成带logo二维码,图片嵌套工具类
2017-08-26 15:14:15java生成二维码工具类,包括生成二维码,生成带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或备注信息
2019-02-27 14:55:48Java生成二维码后,带logo图片时,需要在新生成的二维码图片中,画对应的logo;带备注信息时,需要先准备一张画布,将画布分为二维码信息和备注信息两部分,一部分画二维码信息,一部分写备注信息。 二维码带... -
java生成中间带图片的二维码。
2015-07-09 14:57:06java生成中间带图片的二维码的工具类。 -
java自定义二维码带logo生成代码
2018-03-20 15:19:15在配置文件中简单的配置二维码的信息,即可生成带指定logo图片的二维码,二维码内容颜色自定义 -
Java生成带图片的二维码
2017-08-31 13:57:43生成“名片式(带有背景图片、用户网络头像、用户名称的二维码图片)的二维码