制作、解析带logo的二维码

用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码

工具:GooleZXing

首先下GooleZXing的jar包。

----------------------------------------生成二维码------------------------------------------------

public class GooleZXingQRCodeUtil {

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; 

// 插入图片 
GooleZXingQRCodeUtil.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 = GooleZXingQRCodeUtil.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: [email protected] 
* @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 { 
GooleZXingQRCodeUtil.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 { 
GooleZXingQRCodeUtil.encode(content, null, destPath, needCompress); 
}

/** 
* 生成二维码 

* @param content 
* 内容 
* @param destPath 
* 存储地址 
* @throws Exception 
*/ 
public static void encode(String content, String destPath) throws Exception { 
GooleZXingQRCodeUtil.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 = GooleZXingQRCodeUtil.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 { 
GooleZXingQRCodeUtil.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 GooleZXingQRCodeUtil.decode(new File(path)); 
}

public static void main(String[] args) throws Exception { 
// String text = "I‘m a Shiny boy!!"; 
// GooleZXingQRCodeUtil.encode(text, "F:/test/twocode/123.jpg", "F:/test/twocode/", true);

String imgPath = "F:/test/twocode/girl.png";
String rs=GooleZXingQRCodeUtil.decode(imgPath);
System.out.println("解析结果="+"\n"+rs);


}

-----------------------------------------解析二维码(可带logo图片)-------------------------------------

public class BufferedImageLuminanceSource extends LuminanceSource { 
private final BufferedImage image; 
private final int left; 
private final int top;

public BufferedImageLuminanceSource(BufferedImage image) { 
this(image, 0, 0, image.getWidth(), image.getHeight()); 
}

public BufferedImageLuminanceSource(BufferedImage image, int left, 
int top, int width, int height) { 
super(width, height);

int sourceWidth = image.getWidth(); 
int sourceHeight = image.getHeight(); 
if (left + width > sourceWidth || top + height > sourceHeight) { 
throw new IllegalArgumentException( 
"Crop rectangle does not fit within image data."); 
}

for (int y = top; y < top + height; y++) { 
for (int x = left; x < left + width; x++) { 
if ((image.getRGB(x, y) & 0xFF000000) == 0) { 
image.setRGB(x, y, 0xFFFFFFFF); // = white 


}

this.image = new BufferedImage(sourceWidth, sourceHeight, 
BufferedImage.TYPE_BYTE_GRAY); 
this.image.getGraphics().drawImage(image, 0, 0, null); 
this.left = left; 
this.top = top; 
}

public byte[] getRow(int y, byte[] row) { 
if (y < 0 || y >= getHeight()) { 
throw new IllegalArgumentException( 
"Requested row is outside the image: " + y); 

int width = getWidth(); 
if (row == null || row.length < width) { 
row = new byte[width]; 

image.getRaster().getDataElements(left, top + y, width, 1, row); 
return row; 
}

public byte[] getMatrix() { 
int width = getWidth(); 
int height = getHeight(); 
int area = width * height; 
byte[] matrix = new byte[area]; 
image.getRaster().getDataElements(left, top, width, height, matrix); 
return matrix; 
}

public boolean isCropSupported() { 
return true; 
}

public LuminanceSource crop(int left, int top, int width, int height) { 
return new BufferedImageLuminanceSource(image, this.left + left, 
this.top + top, width, height); 
}

public boolean isRotateSupported() { 
return true; 
}

public LuminanceSource rotateCounterClockwise() { 
int sourceWidth = image.getWidth(); 
int sourceHeight = image.getHeight(); 
AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 
0.0, 0.0, sourceWidth); 
BufferedImage rotatedImage = new BufferedImage(sourceHeight, 
sourceWidth, BufferedImage.TYPE_BYTE_GRAY); 
Graphics2D g = rotatedImage.createGraphics(); 
g.drawImage(image, transform, null); 
g.dispose(); 
int width = getWidth(); 
return new BufferedImageLuminanceSource(rotatedImage, top, 
sourceWidth - (left + width), getHeight(), width); 

}

到此为止,利用Zxing生成和解析二维码就讲述演示完毕,主要为自己做备忘,同时方便有需要的人。呵呵!

时间: 2024-11-05 03:20:59

制作、解析带logo的二维码的相关文章

C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(一)

一.ZXing.Net 源代码地址:http://zxingnet.codeplex.com/ 也可以使用Nuget包管理,添加如图: 说明:ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android.现在也有了对应的.Net版本 二.生成二维码 将字符编码时可以指定字符格式:默认为ISO-8859-1英文字符集,但一般移动设备常用UTF-8字符

Java实现带logo的二维码

Java实现带logo的二维码 二维码应用到生活的各个方面,会用代码实现二维码,我想一定是一项加分的技能.好了,我们来一起实现一下吧. 我们实现的二维码是基于QR Code的标准的,QR Code是由日本Denso公司于1994年研制的一种矩阵二维码符号码,全称是Quick Response Code QR Code:专利公开,支持中文: QR Code与其他二维码相比,具有识读速度快.数据密度大.占用空间小的优势: 纠错能力: L级:约可纠错7%的数据码字 M级:约可纠错15%的数据码字 Q级

涛哥的Python脚本工具箱之生成带Logo的二维码

近期须要在二维码上加Logo,网上没有找到好用的,于是自己用python写了一个. 须要安装qrcode,PIL库 二维码简称 QR Code(Quick Response Code),学名为高速响应矩阵码,是二维条码的一种.由日本的 Denso Wave 公司于 1994 年发明. 现随着智能手机的普及.已广泛应用于寻常生活中,比如商品信息查询.社交好友互动.网络地址訪问等等. 安装 Python 的二维码库 -- qrcode pip install qrcode 因为生成 qrcode 图

.NET生成带Logo的二维码

使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.Current; String data = "二维码的内容";//如果是链接会跳转 if (!string.IsNullOrEmpty(data)) { QRCodeEncoder encoder = new QRCodeEncoder(); Bitmap imgBack = encode

PHP生成带logo图像二维码的两种方法

本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $urlToEncode="http://www.php.cn"; generateQRfromGoogle($urlToEncode); /**

利用phpqrcode二维码生成类库合成带logo的二维码并且用合成的二维码生成海报(二)

前期准备 引入phpqrcode类库(下载地址:https://download.csdn.net/download/weixin_37557729/11891240:支持彩色二维码的下载地址:https://download.csdn.net/download/weixin_37557729/11891244) PHP开启GD扩展库支持 1.利用phpqrcode生成二维码: 原理分析: 下载下来的类文件是一个压缩包,包含很多文件和演示程序,我们只需要里边的phpqrcode.php 这一个文

二维码的功能、特点及使用Java生成带logo的二维码

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集:每个字符占有一定的宽度:具有一定的校验功能等.同时还具有对不同行的信息自动识

ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(goole)生的,QRCode就不用说了吧,虽说技术无国界,但是国人还是有点.... 好,言归正传,java用ZXi

(转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(gool