`
小斌张
  • 浏览: 89275 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

生成二维码 zxing

阅读更多

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

    Java 生成二维码是一种常见的数据编码需求,ZXing(Zebra Crossing)是一个开源的、多格式的一维/二维条码图像处理库,它支持多种条码和二维码的生成与解码。在Java中利用ZXing库生成二维码,可以方便地将文本、链接...

    vb生成二维码QRCODE,使用zxing

    总之,ZXing库为VB.NET开发者提供了一种简单而强大的方式来生成二维码,使得在.NET 2.0及更高版本的应用程序中实现二维码功能变得轻而易举。通过理解和掌握这些基础知识,你就可以在自己的项目中灵活地应用二维码...

    生成二维码zxing.jar

    在做课设的时候要用到二维码,用到com.google.zxing,zxing.jar用于二维码生成,来分享一下~

    生成二维码源代码java版本

    用于普通的生成二维码 代码,控制二维码尺寸和密度等等

    asp.net 动态生成二维码zxing

    asp.net 动态生成二维码 需要引用的dll

    Android利用zxing生成二维码,识别二维码超详细、超简易demo

    Android利用zxing生成二维码,识别二维码超详细、超简易demo,解压后用Android studio可直接打开,附教程:https://blog.csdn.net/mountain_hua/article/details/80646089

    生成二维码ZXing.Net-4.0.zip

    ZXing,一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他...

    ZXing生成二维码包

    生成二维码是ZXing库的核心功能之一。二维码可以存储大量的文本信息,如网址、联系信息、文本字符串等。在Java环境中,我们可以使用ZXing的`com.google.zxing.client.j2se.QRCodeWriter`类来创建一个二维码写入器。...

    一键生成二维码 扫描二维码 Zxing包JAR包

    总结,Zxing是一个强大而灵活的二维码处理库,无论是简单的生成二维码用于分享信息,还是复杂的扫描功能集成到移动应用中,它都能提供高效且可靠的解决方案。通过深入理解和实践,开发者可以轻松地利用Zxing实现一键...

    zxing生成二维码,图片Base64编码

    在这个场景中,我们将讨论如何使用ZXing库生成二维码,并且如何将生成的二维码图片进行Base64编码。 首先,让我们了解二维码的基本原理。二维码(Quick Response Code)是一种二维条形码,能够存储大量的信息,如...

    MATLAB使用zxing生成与识别二维码.zip

    1. **生成二维码**:这通常涉及到创建一个包含特定数据的字符串,然后使用ZXing的Java类`com.google.zxing.qrcode.QRCodeWriter`来编码这个字符串。生成的位图可以通过`writer.encode`方法得到,然后再转换为MATLAB...

    Zxing生成二维码(解决中文乱码)

    这是Zxing的源码,没有打包成jar利于学习使用。...使用时注意path的默认地址,Main类中是生成二维码的代码,GetMain类中是读取二维码的代码。 eclipse中Ctrl+Shift+R快速查找类 希望对你有所帮助。

    C#窗体三种方法生成二维码并打印的小程序

    一、Zxing.NET库生成二维码 Zxing.NET是C#版本的Zxing(又名BarcodeReader)库,它提供了读取和生成条形码与二维码的能力。首先,需要在项目中引入Zxing.Net.Bindings库,通过以下代码生成二维码: ```csharp ...

    Android端最新二维码生成与创建库

    这些库通常包含API,使得在Android应用中生成二维码图像变得非常简单。 2. **集成步骤** - **添加依赖**:首先,你需要在你的`build.gradle`文件(module级别)中添加库的依赖。如果是通过Gradle,会在`...

    Java生成和识别二维码Zxing2.2 支持JDK6

    使用zxing生成解析二维码的实例 简单的几行代码就搞定 使用java实现的。 jar使用的2.2的版本支持JDK6 开发参考代码:https://my.oschina.net/dong706/blog/1608392

    java生成二维码,zxing二维码jar

    "java生成二维码,zxing二维码jar"这个标题指出,我们将使用ZXing库中的jar包来完成这个任务。ZXing提供了两个主要的jar包:core.jar和javase.jar。 1. **core.jar**:这是ZXing的核心库,包含了基本的条码解码和...

    C# 生成二维码源码 可生成图片 底部可显示文字

    在C#中生成二维码,我们可以利用开源库,如 ZXing.Net(也称为 BarcodeReader 和 BarcodeWriter) 或 QRCoder。这两个库都提供了简单易用的API,帮助开发者快速实现二维码的生成和解析。 ZXing.Net 是一个流行的...

    安卓二维码 zxing3.0.0简化版

    - **生成二维码/条形码**:除了读取,ZXing还支持生成二维码和条形码。开发者可以指定数据内容,ZXing会自动生成对应的图像文件。 2. **Eclipse集成**: - **导入工程**:在Eclipse中,将ZXing3.0.0简化版的源...

    JAVA 生成二维码并设置失效机制

    1.通过QRCode.jar包生成二维码,可设置二维码图片格式,二维码图片存放路径,二维码尺寸,二维码颜色 2.二维码扫描内容分为两种,1种为链接式,如:www.zdkc.com,通过链接展示访问的内容,1种为json数据展示,通过...

    这个实例是在DELPHI 11.3环境中做的例子,可以在FMX环境中生成二维码,使用了两种方法 注意要引用DelphiZXing

    在本实例中,我们将深入探讨如何在DELPHI 11.3环境下使用FireMonkey (FMX) 平台生成二维码。此实例演示了两种不同的方法,并依赖于一个名为DelphiZXingQRCode的库,同时还需要引用System.Math单元。通过理解并应用...

Global site tag (gtag.js) - Google Analytics