Java实现生成可跳转指定页面的二维码
Java实现生成可跳转指定页面的二维码
package test; 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 { QRCodeUtil.encode(content, null, output, false); } /** * 解析二维码 * * @param file * 二维码图片 * @return * @throws Exception */ public static String decode(File file) throws Exception { BufferedImage image; image = ImageIO.read(file); if (image == null) { return null; } BufferedImageLuminanceSource source = new BufferedImageLuminanceSource( image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Result result; Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(); hints.put(DecodeHintType.CHARACTER_SET, CHARSET); result = new MultiFormatReader().decode(bitmap, hints); String resultStr = result.getText(); return resultStr; } /** * 解析二维码 * * @param path * 二维码图片地址 * @return * @throws Exception */ public static String decode(String path) throws Exception { return QRCodeUtil.decode(new File(path)); } public static void main(String[] args) throws Exception { String text = "http://www.iteye.com"; //这里设置自定义网站url String logoPath = "d:\\zilv.jpg"; String destPath = "d:\\"; QRCodeUtil.encode(text, logoPath, destPath, true); }
}
本博文为转载,转载地址:https://suko.iteye.com/blog/2244138
Java实现生成可跳转指定页面的二维码相关推荐
- java后台生成二维码以及页面显示二维码方式
上篇文章已经说明并发布了后台生成二维码工具类,大家可以直接去看或者去拿. 地址:最简单实用的java生成二维码工具 现在呢说明页面上展示二维码的两种方式: 1.使用img标签的src来请求生成二维码, ...
- Java代码小demon(一)SpringBoot+二维码和条形码生成
1. 简介 原由 需要一个工具类,可以将数据存储在二维码中,通过扫一扫可以获取到信息,条形码不能接受中文字符 收藏和转载以及自己应用时拓展,具体实现和底层原理还不会,有时间我会去了解或者忘记 借鉴博客 ...
- Java实现微信公众号直接发送参数二维码给用户
文章目录 前言 一.参数二维码的作用 二.功能实现 1. 生成带参数二维码 2. 上传二维码图片 3. 发送带参数二维码给用户 总结 前言 公众号开发近些年是一个比较热门的方向,今天为大家讲解的是用J ...
- 微信公众号开发之生成并扫描带参数的二维码(无需改动)
首先把参考的博文罗列出来: 1.微信公众号开发之生成并扫描带参数的二维码: https://blog.csdn.net/qq_23543983/article/details/80228558 2.由 ...
- 小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈
小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈 一.概述 需要用到的生成二维码组件(可自行下载添加到小程序根目录utils里):https://github.com/demi52 ...
- 页面扫描二维码下载apk ,区分安卓,苹果
在官网的连接上同时有二维码扫描方式与点击下载方式.. 点击下载跳转到下载页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti ...
- Python学习之生成带logo背景图的二维码(静态和动态图)
前言 二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明.现随着智能手机的普及,已广 ...
- C#生成带背景和文字的二维码图片
/// <summary> /// 生成带背景和文字的二维码图片 /// </summary> /// <param na ...
- Web收银页面、二维码收款页面源码
目录 文章目录 目录 源码说明 项目详情 独立项目结构 前端效果展示 部分源码展示 源码说明 WEB收银台页面,付款码支付页面,为独立页面,非弹窗,如需弹窗收银,可参见:简单的扫码支付页面(源码). ...
最新文章
- 二进制搜索算法_使用安全摄像机镜头解释二进制搜索算法
- DELL服务器利用OMSA修改BIOS设置
- php使用redis内存不足,PHP开发:Redis 内存满了怎么办?
- CentOS6.9 下编译安装MySQL5.7.19
- Linux Socket C语言网络编程:Pthread Socket [code from GitHub, for study]
- 中国大陆主要银行卡号对应
- CAD转换高清图片该如何进行设置
- Android信鸽推送全解
- 程序 卡塔_卡塔斯码
- 教程 - 【超详细】从零开始部署网站——阿里云主机CentOS系统
- apk修改android开机画面,Android手机开机动画的修改
- android 左右分栏联动布局,自定义页面分栏布局
- 坚守普惠金融初心,微众银行持续升级无障碍金融服务
- 蓝色TADF分子3DPyM-pDTC,2DPyM-mDTC,2DPyM-mDBr ,3DPyM-pDBr:蓝色热激活延迟荧光材料
- Fabric 1.0源代码分析(22)Ledger #blkstorage(block文件存储)
- SQLServer阻止保存要求重新创建表的更改,sql在一列数据前统一加字符
- 能否在虚拟平台里构建真实的生活体验?
- 常用日本语1000句+简单用语
- 湖南省株洲市谷歌高清卫星地图下载
- 淘宝/天猫api数据接口,获得淘宝商品详情 API 返回值说明
热门文章
- Unity3D优化技巧系列一
- 手机应用软件下载导航php源码_腾讯地图官方版下载-腾讯地图手机导航9.1.1 最新版...
- Ubuntu基本操作命令
- 星汉未来成为 FinOps 产业标准生态联盟首批会员
- 宜信开源|Davinci:可视应用平台介绍与展望
- python小欢喜(八)俄罗斯方块 (5) 生成各种组合形状
- 【论文翻译】YOLOv4: Optimal Speed and Accuracy of Object Detection
- FCKeditor源代码分析(一)-----fckeditor.js的中文注释分析(原创)
- 高斯,数据科学家最爱的男人(我们不是GAY!)
- 股指期货交易规则概述—股指期货网