package com.feinno.wbs.web.util;
import java.awt.BasicStroke;
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.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.feinno.xframe.util.LogUtils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 二维码工具类
* @author yuandalong
*
*/
public class QrUtil {
private static final Logger log = LoggerFactory.getLogger(QrUtil.class);
/**
* 生成二维码
* @param str
* @param response
*/
public static void encode(String str,String logoPath,String eclevel,String qrcolor, HttpServletResponse response,int qrWidth,int qrHeight,int pix)
{
try{
Map<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//使用小写的编码,大写会出现]Q2\000026开头内容
//ErrorCorrectionLevel.H 容错率:容错率越高,二维码的有效像素点就越多.
if (StringUtils.equals(eclevel, "M")) {
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
}else if (StringUtils.equals(eclevel, "L")) {
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
}else if (StringUtils.equals(eclevel, "Q")) {
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
}else if (StringUtils.equals(eclevel, "H")) {
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
}else{
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
}
hints.put(EncodeHintType.MARGIN, 0);//margin 边框设置
BitMatrix martrix = new MultiFormatWriter().encode(str,
BarcodeFormat.QR_CODE, qrWidth, qrHeight, hints);
//二维码
int bgColor = 0xFF000000;
if (!StringUtils.isBlank(qrcolor)) {
bgColor = Integer.parseInt(qrcolor.substring(4), 16);// 转换成int
}
BufferedImage bufferImage = new BufferedImage(martrix.getWidth(), martrix.getHeight(), BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < martrix.getWidth(); x++) {
for (int y = 0; y < martrix.getHeight(); y++) {
bufferImage.setRGB(x, y, martrix.get(x, y) ? bgColor : 0xFFFFFFFF);//填充,可设置颜色 颜色的取值为后6位
}
}
if (!StringUtils.isEmpty(logoPath)) {
File file = new File(logoPath);
if (file.exists()) {
int width = (int) (qrWidth / pix);
int height = (int)(qrHeight / pix);
Image thumb = generatThumbnails(file, null, width, height, true);
if (thumb != null) {
//插入logo
Graphics2D graph = bufferImage.createGraphics();
int w = thumb.getWidth(null);
int h = thumb.getHeight(null);
int x = (qrWidth - thumb.getWidth(null)) / 2; //设置logo的插入位置
int y = (qrHeight - thumb.getHeight(null)) / 2;
graph.drawImage(thumb, x, y, w, h, null);
Shape shape = new RoundRectangle2D.Float(x, y, w, h, 16, 16); // 后面两个参数是设置周边圆角,数值越大圆角越大
graph.setStroke(new BasicStroke(3f));
graph.draw(shape);
graph.dispose();
}
}
}
ImageIO.write(bufferImage, "jpg", response.getOutputStream());
}catch(Exception e){
log.error(LogUtils.getExceptionTrace(e));
}
}
/**
* 生成logo缩略图
* @param file 输入的文件流
* @param outputPath 输出路径
* @param width 缩略图宽
* @param height 缩略图高
* @param proportion 是否等比例缩放
*/
private static Image generatThumbnails(File file, String outputPath, int width, int height, boolean proportion)
{
log.info("缩略图宽:{}, 高:{}", new Object[]{width, height});
try {
BufferedImage img = ImageIO.read(file);
if (img.getWidth(null) == -1) {
log.info("图片无法读取!");
return null;
}
if (width <=0 || height <= 0) {
log.info("新生成的缩略图宽高不得小于0!");
return null;
}
int newWidth;
int newHeight;
if (proportion) {
//等比例压缩
double rate1 = ((double)img.getWidth(null)) / (double)width + 0.1;
double rate2 = ((double)img.getHeight(null)) / (double)height + 0.1;
log.info("缩放比例1:{}, 缩放比例2:{}, 原生宽度:{}, 原生高度:{}", new Object[]{rate1, rate2, img.getWidth(null), img.getHeight(null)});
//按照缩放比率大的进行缩放
double rate = rate1 > rate2 ? rate1 : rate2;
newWidth = (int) (((double) img.getWidth(null)) / rate);
newHeight = (int) (((double) img.getHeight(null)) / rate);
}else{
newWidth = width; // 输出的图片宽度
newHeight = height;
}
log.info("缩略图新的宽度:{}, 新的高度:{}", new Object[]{newWidth,newHeight});
BufferedImage tag = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
/**
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的
* 优先级比速度高 生成的图片质量比较好 但速度慢
*/
Image thumb = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
tag.getGraphics().drawImage(thumb, 0, 0, null);
if (!StringUtils.isEmpty(outputPath)) {
FileOutputStream out = new FileOutputStream(outputPath);
// JPEGImageEncoder可适用于其他图片类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
}
return thumb;
} catch (IOException e) {
log.error(LogUtils.getExceptionTrace(e));
return null;
}
}
}
相关推荐
Java 生成二维码是一种常见的数据编码需求,ZXing(Zebra Crossing)是一个开源的、多格式的一维/二维条码图像处理库,它支持多种条码和二维码的生成与解码。在Java中利用ZXing库生成二维码,可以方便地将文本、链接...
总之,ZXing库为VB.NET开发者提供了一种简单而强大的方式来生成二维码,使得在.NET 2.0及更高版本的应用程序中实现二维码功能变得轻而易举。通过理解和掌握这些基础知识,你就可以在自己的项目中灵活地应用二维码...
在做课设的时候要用到二维码,用到com.google.zxing,zxing.jar用于二维码生成,来分享一下~
用于普通的生成二维码 代码,控制二维码尺寸和密度等等
asp.net 动态生成二维码 需要引用的dll
Android利用zxing生成二维码,识别二维码超详细、超简易demo,解压后用Android studio可直接打开,附教程:https://blog.csdn.net/mountain_hua/article/details/80646089
ZXing,一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他...
生成二维码是ZXing库的核心功能之一。二维码可以存储大量的文本信息,如网址、联系信息、文本字符串等。在Java环境中,我们可以使用ZXing的`com.google.zxing.client.j2se.QRCodeWriter`类来创建一个二维码写入器。...
总结,Zxing是一个强大而灵活的二维码处理库,无论是简单的生成二维码用于分享信息,还是复杂的扫描功能集成到移动应用中,它都能提供高效且可靠的解决方案。通过深入理解和实践,开发者可以轻松地利用Zxing实现一键...
在这个场景中,我们将讨论如何使用ZXing库生成二维码,并且如何将生成的二维码图片进行Base64编码。 首先,让我们了解二维码的基本原理。二维码(Quick Response Code)是一种二维条形码,能够存储大量的信息,如...
1. **生成二维码**:这通常涉及到创建一个包含特定数据的字符串,然后使用ZXing的Java类`com.google.zxing.qrcode.QRCodeWriter`来编码这个字符串。生成的位图可以通过`writer.encode`方法得到,然后再转换为MATLAB...
这是Zxing的源码,没有打包成jar利于学习使用。...使用时注意path的默认地址,Main类中是生成二维码的代码,GetMain类中是读取二维码的代码。 eclipse中Ctrl+Shift+R快速查找类 希望对你有所帮助。
一、Zxing.NET库生成二维码 Zxing.NET是C#版本的Zxing(又名BarcodeReader)库,它提供了读取和生成条形码与二维码的能力。首先,需要在项目中引入Zxing.Net.Bindings库,通过以下代码生成二维码: ```csharp ...
这些库通常包含API,使得在Android应用中生成二维码图像变得非常简单。 2. **集成步骤** - **添加依赖**:首先,你需要在你的`build.gradle`文件(module级别)中添加库的依赖。如果是通过Gradle,会在`...
使用zxing生成解析二维码的实例 简单的几行代码就搞定 使用java实现的。 jar使用的2.2的版本支持JDK6 开发参考代码:https://my.oschina.net/dong706/blog/1608392
在C#中生成二维码,我们可以利用开源库,如 ZXing.Net(也称为 BarcodeReader 和 BarcodeWriter) 或 QRCoder。这两个库都提供了简单易用的API,帮助开发者快速实现二维码的生成和解析。 ZXing.Net 是一个流行的...
"java生成二维码,zxing二维码jar"这个标题指出,我们将使用ZXing库中的jar包来完成这个任务。ZXing提供了两个主要的jar包:core.jar和javase.jar。 1. **core.jar**:这是ZXing的核心库,包含了基本的条码解码和...
1.通过QRCode.jar包生成二维码,可设置二维码图片格式,二维码图片存放路径,二维码尺寸,二维码颜色 2.二维码扫描内容分为两种,1种为链接式,如:www.zdkc.com,通过链接展示访问的内容,1种为json数据展示,通过...
- **生成二维码/条形码**:除了读取,ZXing还支持生成二维码和条形码。开发者可以指定数据内容,ZXing会自动生成对应的图像文件。 2. **Eclipse集成**: - **导入工程**:在Eclipse中,将ZXing3.0.0简化版的源...
对zxing的core3.4.0新增了使用byte数组生成二维码的方法和解码方法,新增内容详细代码和使用方法参考: 改写步骤:zxing使用byte数组生成二维码和解析二维码。...使用方法:java压缩字符串并生成二维码...