首页下载资源后端java生成二维码两种方式(一种中间带logo,一种不带)源码

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

semial1.4MB需要积分:1

资源文件列表:

demo.rar 大约有26个文件
  1. demo\.classpath 327B
  2. demo\.project 205B
  3. demo\.settings\org.eclipse.jdt.core.prefs 208B
  4. demo\bin\com\han\demo\BufferedImageLuminanceSource.class 1.76KB
  5. demo\bin\com\han\demo\MatrixToImageWriter.class 1.11KB
  6. demo\bin\com\han\demo\MyTest.class 948B
  7. demo\bin\com\han\demo\QRCodeUtil.class 3.48KB
  8. demo\bin\com\han\demo\TestLogo.class 491B
  9. demo\lib\core-3.1.0.jar 476.27KB
  10. demo\lib\Qrcode_swetake.jar 943.65KB
  11. demo\src\com\han\demo\BufferedImageLuminanceSource.java 961B
  12. demo\src\com\han\demo\MatrixToImageWriter.java 536B
  13. demo\src\com\han\demo\MyTest.java 477B
  14. demo\src\com\han\demo\QRCodeUtil.java 2.17KB
  15. demo\src\com\han\demo\TestLogo.java 244B
  16. demo\bin\com\han\demo
  17. demo\src\com\han\demo
  18. demo\bin\com\han
  19. demo\src\com\han
  20. demo\bin\com
  21. demo\src\com
  22. demo\.settings
  23. demo\bin
  24. demo\lib
  25. demo\src
  26. demo

资源介绍:

在Java编程环境中,生成二维码是常见的任务,尤其在移动应用、网页链接分享等领域。本文将详细介绍两种在Java中生成二维码的方法:一种是带有logo的,另一种则是不带logo的。这两种方法都基于开源库,例如ZXing(Zebra Crossing)。 1. **ZXing库介绍** ZXing是一个开源的、多格式的一维/二维条码图像处理库,它能够读取、写入多种条码格式。在生成二维码时,我们可以利用ZXing提供的`com.google.zxing`包中的类和方法。 2. **生成不带logo的二维码** - 引入ZXing库到项目中,如果是Maven项目,添加以下依赖: ```xml com.google.zxing core 3.4.1 com.google.zxing javase 3.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 hints = new Hashtable(); 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 {
100+评论
captcha