ZXing生成二维码,以及给二维码添加Logo
来源:互联网 发布:vb winhttp 编辑:程序博客网 时间:2024/06/05 09:36
二维码生成主要使用了Google的zxing开源包。具体jar去官网下载!
类引入:
package com.rayn.qt1;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
生成代码如下所示,
1.二维码属性设置
public Map getDecodeHintType()
{
// 用于设置QR二维码参数
Map hints = new HashMap();
// 设置QR二维码的纠错级别(H为最高级别)具体级别信息
hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H);
// 设置编码方式
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.MAX_SIZE, 350);
hints.put(EncodeHintType.MIN_SIZE, 100);
return hints;
}
2.二维码的数据信息初始化
public BufferedImage fileToBufferedImage(BitMatrix bm)
{
BufferedImage image = null;
try
{
int w = bm.getWidth(), h = bm.getHeight();
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
image.setRGB(x, y, bm.get(x, y) ? 0xFF000000 : 0xFFCCDDEE);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
return image;
}
3.二维码生成
public BufferedImage getQR_CODEBufferedImage(String content,BarcodeFormat barcodeFormat, int width, int height, Maphints)
{
MultiFormatWriter multiFormatWriter = null;
BitMatrix bm = null;
BufferedImage image = null;
try
{
multiFormatWriter = new MultiFormatWriter();
// 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
bm = multiFormatWriter.encode(content, barcodeFormat, width,height, hints);
int w = bm.getWidth();
int h = bm.getHeight();
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
// 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
image.setRGB(x, y, bm.get(x, y) ? 0xFF000000 : 0xFFCCDDEE);
}
}
}
catch (WriterException e)
{
e.printStackTrace();
}
return image;
}
4.二维码的生成输出文件或输出流进行使用
public void decodeQR_CODE2ImageFile(BitMatrix bm, StringimageFormat, File file)
{
try
{
if (null == file || file.getName().trim().isEmpty())
{
throw new IllegalArgumentException
}
BufferedImage bi = fileToBufferedImage(bm);
ImageIO.write(bi, "jpeg", file);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void decodeQR_CODE2OutputStream(BitMatrix bm, StringimageFormat, OutputStream os)
{
try
{
BufferedImage image = fileToBufferedImage(bm);
ImageIO.write(image, imageFormat, os);
}
catch (Exception e)
{
e.printStackTrace();
}
}
5.给二维码中间的部分添加Logo图片。类似微信那样的
public void addLogo_QRCode(File qrPic, File logoPic, LogoConfiglogoConfig)
{
try
{
if (!qrPic.isFile() || !logoPic.isFile())
{
System.out.print("file not find !");
System.exit(0);
}
BufferedImage image = ImageIO.read(qrPic);
Graphics2D g = image.createGraphics();
BufferedImage logo = ImageIO.read(logoPic);
int widthLogo = logo.getWidth(), heightLogo =logo.getHeight();
// 计算图片放置位置
int x = (image.getWidth() - widthLogo) / 2;
int y = (image.getHeight() - logo.getHeight()) / 2;
//开始绘制图片
g.drawImage(logo, x, y, widthLogo, heightLogo, null);
g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
g.setStroke(new BasicStroke(logoConfig.getBorder()));
g.setColor(logoConfig.getBorderColor());
g.drawRect(x, y, widthLogo, heightLogo);
g.dispose();
ImageIO.write(image, "jpeg", new File("D:/newPic.jpg"));
}
catch (Exception e)
{
e.printStackTrace();
}
}
Logo辅助类:
public class LogoConfig
{
// logo默认边框颜色
public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
// logo默认边框宽度
public static final int DEFAULT_BORDER = 2;
// logo大小默认为照片的1/5
public static final int DEFAULT_LOGOPART = 5;
private final int border = DEFAULT_BORDER;
private final Color borderColor;
private final int logoPart;
public LogoConfig()
{
this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
}
public LogoConfig(Color borderColor, int logoPart)
{
this.borderColor = borderColor;
this.logoPart = logoPart;
}
public Color getBorderColor()
{
return borderColor;
}
public int getBorder()
{
return border;
}
public int getLogoPart()
{
return logoPart;
}
}
6.二维码解析
public void parseQR_CODEImage(File file)
{
try
{
MultiFormatReader formatReader = new MultiFormatReader();
// File file = new File(filePath);
if (!file.exists())
{
return;
}
BufferedImage image = ImageIO.read(file);
LuminanceSource source = newBufferedImageLuminanceSo
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
Result result = formatReader.decode(binaryBitmap, hints);
System.out.println("result = " + result.toString());
System.out.println("resultFormat = " +result.getBarcodeFormat());
System.out.println("resultText = " + result.getText());
}
catch (Exception e)
{
e.printStackTrace();
}
}
package
com.rayn.qt1;
import
java.awt.BasicStroke;
import
java.awt.Color;
import
java.awt.Graphics2D;
import
java.awt.image.BufferedImage;
import
java.io.File;
import
java.io.OutputStream;
import
java.util.Date;
import
java.util.HashMap;
import
java.util.Map;
import
javax.imageio.ImageIO;
import
com.google.zxing.BarcodeFormat;
import
com.google.zxing.Binarizer;
import
com.google.zxing.BinaryBitmap;
import
com.google.zxing.EncodeHintType;
import
com.google.zxing.LuminanceSource;
import
com.google.zxing.MultiFormatReader;
import
com.google.zxing.MultiFormatWriter;
import
com.google.zxing.Result;
import
com.google.zxing.WriterException;
import
com.google.zxing.common.BitMatrix;
import
com.google.zxing.common.HybridBinarizer;
import
com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public
class
ZXingPic
{
public
static
void
main(String[]args)
throws
WriterException
{
Stringcontent =
"【优秀员工】恭喜您,中奖了!!!领取方式,请拨打电话:15998099997*咨询。"
;
StringfilePath =
"D:/weibow.jpg"
;
//if(args.length != 2)
//{
//System.out.println("没有内容,图片生成失败!");
//System.exit(0);
//}
try
{
Filefile =
new
File(filePath);
if
(file.exists())
{
file=
new
File(
"D:/"
,
new
Date().getTime() +
".jpg"
);
}
ZXingPiczp =
new
ZXingPic();
BufferedImagebim = zp.getQR_CODEBufferedImage(content,BarcodeFormat.QR_CODE,
300
,
300
,zp.getDecodeHintType());
ImageIO.write(bim,
"jpeg"
,file);
zp.addLogo_QRCode(file,
new
File(
"D:/123123123.jpg"
),
new
LogoConfig());
Thread.sleep(
5000
);
zp.parseQR_CODEImage(
new
File(
"D:/newPic.jpg"
));
}
catch
(Exception e)
{
e.printStackTrace();
}
}
public
void
addLogo_QRCode(File qrPic, File logoPic, LogoConfiglogoConfig)
{
try
{
if
(!qrPic.isFile() ||!logoPic.isFile())
{
System.out.print(
"filenot find !"
);
System.exit(
0
);
}
BufferedImageimage = ImageIO.read(qrPic);
Graphics2Dg = image.createGraphics();
BufferedImagelogo = ImageIO.read(logoPic);
int
widthLogo = logo.getWidth(), heightLogo =logo.getHeight();
//计算图片放置位置
int
x = (image.getWidth() - widthLogo)/
2
;
int
y = (image.getHeight() - logo.getHeight())/
2
;
//开始绘制图片
g.drawImage(logo,x, y, widthLogo, heightLogo,
null
);
g.drawRoundRect(x,y, widthLogo, heightLogo,
15
,
15
);
g.setStroke(
new
BasicStroke(logoConfig.getBorder()));
g.setColor(logoConfig.getBorderColor());
g.drawRect(x,y, widthLogo, heightLogo);
g.dispose();
ImageIO.write(image,
"jpeg"
,
new
File(
"D:/newPic.jpg"
));
}
catch
(Exception e)
{
e.printStackTrace();
}
}
public
void
parseQR_CODEImage(File file)
{
try
{
MultiFormatReaderformatReader =
new
MultiFormatReader();
//File file = new File(filePath);
if
(!file.exists())
{
return
;
}
BufferedImageimage = ImageIO.read(file);
LuminanceSourcesource =
new
BufferedImageLuminanceSource(image);
Binarizerbinarizer =
new
HybridBinarizer(source);
BinaryBitmapbinaryBitmap =
new
BinaryBitmap(binarizer);
Maphints =
new
HashMap();
hints.put(EncodeHintType.CHARACTER_SET,
"UTF-8"
);
Resultresult = formatReader.decode(binaryBitmap, hints);
System.out.println(
"result= "
+result.toString());
System.out.println(
"resultFormat= "
+result.getBarcodeFormat());
System.out.println(
"resultText= "
+result.getText());
}
catch
(Exception e)
{
e.printStackTrace();
}
}
public
void
decodeQR_CODE2ImageFile(BitMatrix bm, StringimageFormat, File file)
{
try
{
if
(
null
== file ||file.getName().trim().isEmpty())
{
throw
new
IllegalArgumentException(
"文件异常,或扩展名有问题!"
);
}
BufferedImagebi = fileToBufferedImage(bm);
ImageIO.write(bi,
"jpeg"
,file);
}
catch
(Exception e)
{
e.printStackTrace();
}
}
public
void
decodeQR_CODE2OutputStream(BitMatrix bm, StringimageFormat, OutputStream os)
{
try
{
BufferedImageimage = fileToBufferedImage(bm);
ImageIO.write(image,imageFormat, os);
}
catch
(Exception e)
{
e.printStackTrace();
}
}
public
BufferedImagefileToBufferedImage(BitMatrix bm)
{
BufferedImageimage =
null
;
try
{
int
w = bm.getWidth(), h =bm.getHeight();
image=
new
BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
for
(
int
x =
0
; x <w; x++)
{
for
(
int
y =
0
; y <h; y++)
{
image.setRGB(x,y, bm.get(x, y) ?
0xFF000000
:
0xFFCCDDEE
);
}
}
}
catch
(Exception e)
{
e.printStackTrace();
}
return
image;
}
public
BufferedImagegetQR_CODEBufferedImage(String content, BarcodeFormatbarcodeFormat,
int
width,
int
height, Maphints)
{
MultiFormatWritermultiFormatWriter =
null
;
BitMatrixbm =
null
;
BufferedImageimage =
null
;
try
{
multiFormatWriter=
new
MultiFormatWriter();
//参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
bm= multiFormatWriter.encode(content, barcodeFormat, width, height,hints);
int
w = bm.getWidth();
int
h = bm.getHeight();
image=
new
BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
//开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
for
(
int
x =
0
; x <w; x++)
{
for
(
int
y =
0
; y <h; y++)
{
image.setRGB(x,y, bm.get(x, y) ?
0xFF000000
:
0xFFCCDDEE
);
}
}
}
catch
(WriterException e)
{
e.printStackTrace();
}
return
image;
}
public
Map getDecodeHintType()
{
//用于设置QR二维码参数
Maphints =
new
HashMap();
//设置QR二维码的纠错级别(H为最高级别)具体级别信息
hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H);
//设置编码方式
hints.put(EncodeHintType.CHARACTER_SET,
"utf-8"
);
hints.put(EncodeHintType.MAX_SIZE,
350
);
hints.put(EncodeHintType.MIN_SIZE,
100
);
return
hints;
}
}
class
LogoConfig
{
//logo默认边框颜色
public
static
final
ColorDEFAULT_BORDERCOLOR = Color.WHITE;
//logo默认边框宽度
public
static
final
int
DEFAULT_BORDER =
2
;
//logo大小默认为照片的1/5
public
static
final
int
DEFAULT_LOGOPART =
5
;
private
final
int
border =DEFAULT_BORDER;
private
final
Color borderColor;
private
final
int
logoPart;
public
LogoConfig()
{
this
(DEFAULT_BORDERCOLOR,DEFAULT_LOGOPART);
}
public
LogoConfig(Color borderColor,
int
logoPart)
{
this
.borderColor= borderColor;
this
.logoPart= logoPart;
}
public
Color getBorderColor()
{
return
borderColor;
}
public
int
getBorder()
{
return
border;
}
public
int
getLogoPart()
{
return
logoPart;
}
}
- ZXing生成二维码,以及给二维码添加Logo
- Zxing生成二维码和添加Logo
- Zxing生成含有LOGO二维码
- zxing 二维码、带logo二维码生成
- ZXing生成条形码、二维码、带logo二维码
- Android:使用ZXing生成二维码(支持添加Logo图案)
- Android:使用ZXing生成二维码(支持添加Logo图案)
- Zxing生产二维码 附带添加logo
- 条形码、二维码以及二维码添加logo
- Zxing.jar生成带有logo的二维码
- 使用Zxing生成带logo的二维码
- 使用Zxing生成带有logo的二维码
- 使用ZXing生成二维码(带logo)
- zxing生成和解析带logo二维码
- Java:生成带logo的二维码(ZXing)
- ZXING生成二维码以及解析
- 二维码及带logo二维码的生成和解析-Zxing
- ZXing生成二维码和带logo的二维码
- 第4章 对象
- qml构建一个渐变色的窗口
- HBase之表的设计原则
- hdu 2227Find the nondecreasing subsequences(树状数组+dp+离散化)
- NOIP2015模拟1
- ZXing生成二维码,以及给二维码添加Logo
- Android Studio App设置线性布局LinerLayout控件垂直/水平方向排列
- Hibernate关联之 一对多外键单向关联
- oldssoj2677
- G语言图形内核库
- mysql 定时任务
- 抽象的方法能否同时是static、native、synchronized
- Unity3D中Blendshapes之间的过渡方式
- 信号量(Semaphore) 例子