下载资源后端资源详情
demo.rar
大小:1.4MB
价格:10积分
下载量:0
评分:
5.0
上传者:semial
更新日期:2025-09-22

java生成二维码两种方式(一种中间带logo,一种不带)源码

资源文件列表(大概)

文件名
大小
demo\.classpath
327B
demo\.project
205B
demo\.settings\org.eclipse.jdt.core.prefs
208B
demo\bin\com\han\demo\BufferedImageLuminanceSource.class
1.76KB
demo\bin\com\han\demo\MatrixToImageWriter.class
1.11KB
demo\bin\com\han\demo\MyTest.class
948B
demo\bin\com\han\demo\QRCodeUtil.class
3.48KB
demo\bin\com\han\demo\TestLogo.class
491B
demo\lib\core-3.1.0.jar
476.27KB
demo\lib\Qrcode_swetake.jar
943.65KB
demo\src\com\han\demo\BufferedImageLuminanceSource.java
961B
demo\src\com\han\demo\MatrixToImageWriter.java
536B
demo\src\com\han\demo\MyTest.java
477B
demo\src\com\han\demo\QRCodeUtil.java
2.17KB
demo\src\com\han\demo\TestLogo.java
244B
demo\bin\com\han\demo
-
demo\src\com\han\demo
-
demo\bin\com\han
-
demo\src\com\han
-
demo\bin\com
-
demo\src\com
-
demo\.settings
-
demo\bin
-
demo\lib
-
demo\src
-
demo
-

资源内容介绍

在Java编程环境中,生成二维码是常见的任务,尤其在移动应用、网页链接分享等领域。本文将详细介绍两种在Java中生成二维码的方法:一种是带有logo的,另一种则是不带logo的。这两种方法都基于开源库,例如ZXing(Zebra Crossing)。1. **ZXing库介绍** ZXing是一个开源的、多格式的一维/二维条码图像处理库,它能够读取、写入多种条码格式。在生成二维码时,我们可以利用ZXing提供的`com.google.zxing`包中的类和方法。2. **生成不带logo的二维码** - 引入ZXing库到项目中,如果是Maven项目,添加以下依赖: ```xml com.google.zxingcore3.4.1com.google.zxingjavase3.4.1 ``` - 使用`com.google.zxing.client.j2se.MatrixToImageWriter`和`com.google.zxing.common.BitMatrix`来生成二维码图片: ```java private void generateQRCodeWithoutLogo(String content, String filePath) { try { // 创建二维码编码器 QRCodeWriter qrCodeWriter = new QRCodeWriter(); // 设置编码参数,如纠错级别 Map hints = new HashMap<>(); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 获取BitMatrix BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300, hints); // 将BitMatrix转换为图片并保存 MatrixToImageWriter.writeToFile(bitMatrix,"PNG", new File(filePath)); } catch (WriterException | IOException e) { e.printStackTrace(); } } ```3. **生成带有logo的二维码** - 在生成二维码后,我们需要将logo图片合并到二维码上。这里我们可以使用Java的`java.awt`和`javax.imageio`包。 - 加载logo图片: ```java BufferedImage logoImage = ImageIO.read(new File("path_to_logo.png")); ``` - 然后,将logo添加到二维码图片上: ```java private void generateQRCodeWithLogo(String content, String filePath, String logoPath) { // 生成二维码图片 BufferedImage qrImage = generateQRCodeWithoutLogo(content, filePath); // 计算logo在二维码中的位置 int logoWidth = logoImage.getWidth(); int logoHeight = logoImage.getHeight(); int qrWidth = qrImage.getWidth(); int qrHeight = qrImage.getHeight(); int logoX = (qrWidth - logoWidth) / 2; int logoY = (qrHeight - logoHeight) / 2; // 复制logo到二维码 Graphics2D g2d = qrImage.createGraphics(); g2d.drawImage(logoImage, logoX, logoY, null); g2d.dispose(); // 保存结果 ImageIO.write(qrImage,"PNG", new File(filePath +"_withLogo.png")); } ```以上就是使用Java生成带有和不带logo的二维码的基本方法。通过调整参数,你可以自定义二维码的大小、颜色、边距等特性。需要注意的是,在实际项目中,要确保logo的尺寸合适,不会遮挡过多的二维码数据区域,以免影响二维码的可扫描性。同时,为了保持代码的可维护性和可扩展性,可以将这些功能封装成一个独立的服务或类。
package com.han.demo;import java.awt.BasicStroke;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Shape;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.OutputStream;import java.util.Hashtable;import java.util.Random;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;import com.google.zxing.BinaryBitmap;import com.google.zxing.DecodeHintType;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatReader;import com.google.zxing.MultiFormatWriter;import com.google.zxing.Result;import com.google.zxing.common.BitMatrix;import com.google.zxing.common.HybridBinarizer;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class QRCodeUtil { private static final String CHARSET = "utf-8"; private static final String FORMAT_NAME = "JPG"; // 二维码尺寸 private static final int QRCODE_SIZE = 300; // LOGO宽度 private static final int WIDTH = 60; // LOGO高度 private static final int HEIGHT = 60; private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception { Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); hints.put(EncodeHintType.CHARACTER_SET, CHARSET); hints.put(EncodeHintType.MARGIN, 1); BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints); int width = bitMatrix.getWidth(); int height = bitMatrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF); } } if (imgPath == null || "".equals(imgPath)) { return image; } // 插入图片 QRCodeUtil.insertImage(image, imgPath, needCompress); return image; } /** * 插入LOGO * * @param source * 二维码图片 * @param imgPath * LOGO图片地址 * @param needCompress * 是否压缩 * @throws Exception */ private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception { File file = new File(imgPath); if (!file.exists()) { System.err.println(""+imgPath+" 该文件不存在!"); return; } Image src = ImageIO.read(new File(imgPath)); int width = src.getWidth(null); int height = src.getHeight(null); if (needCompress) { // 压缩LOGO if (width > WIDTH) { width = WIDTH; } if (height > HEIGHT) { height = HEIGHT; } Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH); BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(image, 0, 0, null); // 绘制缩小后的图 g.dispose(); src = image; } // 插入LOGO Graphics2D graph = source.createGraphics(); int x = (QRCODE_SIZE - width) / 2; int y = (QRCODE_SIZE - height) / 2; graph.drawImage(src, x, y, width, height, null); Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); graph.setStroke(new BasicStroke(3f)); graph.draw(shape); graph.dispose(); } /** * 生成二维码(内嵌LOGO) * * @param content * 内容 * @param imgPath * LOGO地址 * @param destPath * 存放目录 * @param needCompress * 是否压缩LOGO * @throws Exception */ public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception { BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress); mkdirs(destPath); String file = new Random().nextInt(99999999)+".jpg"; ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file)); } /** * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) * @author lanyuan * Email: mmm333zzz520@163.com * @date 2013-12-11 上午10:16:36 * @param destPath 存放目录 */ public static void mkdirs(String destPath) { File file =new File(destPath); //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) if (!file.exists() && !file.isDirectory()) { file.mkdirs(); } } /** * 生成二维码(内嵌LOGO) * * @param content * 内容 * @param imgPath * LOGO地址 * @param destPath * 存储地址 * @throws Exception */ public static void encode(String content, String imgPath, String destPath) throws Exception { QRCodeUtil.encode(content, imgPath, destPath, false); } /** * 生成二维码 * * @param content * 内容 * @param destPath * 存储地址 * @param needCompress * 是否压缩LOGO * @throws Exception */ public static void encode(String content, String destPath, boolean needCompress) throws Exception { QRCodeUtil.encode(content, null, destPath, needCompress); } /** * 生成二维码 * * @param content * 内容 * @param destPath * 存储地址 * @throws Exception */ public static void encode(String content, String destPath) throws Exception { QRCodeUtil.encode(content, null, destPath, false); } /** * 生成二维码(内嵌LOGO) * * @param content * 内容 * @param imgPath * LOGO地址 * @param output * 输出流 * @param needCompress * 是否压缩LOGO * @throws Exception */ public static void encode(String content, String imgPath, OutputStream output, boolean needCompress) throws Exception { BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress); ImageIO.write(image, FORMAT_NAME, output); } /** * 生成二维码 * * @param content * 内容 * @param output * 输出流 * @throws Exception */ public static void encode(String content, OutputStream output) throws Exception {

用户评论 (0)

发表评论

captcha

相关资源

最简单的基于FFMPEG的视频播放器1.1

本程序实现了视频文件的解码和显示(支持HEVC,H.264,MPEG2等)。是最简单的FFmpeg视频解码方面的教程。通过学习本例子可以了解FFmpeg的解码流程。项目包含两个工程:simplest_ffmpeg_player:标准版,FFmpeg学习的开始。simplest_ffmpeg_player_su:SU(SDL Update)版,加入了简单的SDL的Event。备注:标准版在播放视频的时候,画面显示使用延时40ms的方式。这么做有两个后果:(1)SDL弹出的窗口无法移动,一直显示是忙碌状态(2)画面显示并不是严格的40ms一帧,因为还没有考虑解码的时间。SU(SDL Update)版在视频解码的过程中,不再使用延时40ms的方式,而是创建了一个线程,每隔40ms发送一个自定义的消息,告知主函数进行解码显示。这样做之后:(1)SDL弹出的窗口可以移动了(2)画面显示是严格的40ms一帧

16.93MB16积分

android开发入门教程(上+下)

android开发入门教程(上+下)

35.87MB13积分

开源H.264码流分析器(程序+源代码)

自己做的H.264码流分析工具。可以分析每个NAL的信息,支持中英双语。本着开源的原则,包含了源代码。工程使用VC2010和MFC开发完成。

1.35MB27积分

学生信息管理系统(Java编写,包括所有源代码)

该文档包含了从需求分析到设计再到实现的全过程,非常的全面,其中包括各种软件的使用,有截图。非常适合学习和毕业设计的需要!

3.83MB37积分