package
cn.kuwo.util;
import
java.awt.Color;
import
java.awt.Graphics2D;
import
java.awt.image.BufferedImage;
import
java.io.File;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
javax.imageio.ImageIO;
import
jp.sourceforge.qrcode.QRCodeDecoder;
import
jp.sourceforge.qrcode.exception.DecodingFailedException;
import
com.swetake.util.Qrcode;
public
class
TwoDimensionCode {
/**
*
生成二维码(QRCode)图片
*
@param content 存储内容
*
@param imgPath 图片路径
*/
public
void
encoderQRCode(String content, String imgPath) {
this
.encoderQRCode(content,
imgPath,
"png"
,
7
);
}
/**
*
生成二维码(QRCode)图片
*
@param content 存储内容
*
@param output 输出流
*/
public
void
encoderQRCode(String content, OutputStream output) {
this
.encoderQRCode(content,
output,
"png"
,
7
);
}
/**
*
生成二维码(QRCode)图片
*
@param content 存储内容
*
@param imgPath 图片路径
*
@param imgType 图片类型
*/
public
void
encoderQRCode(String content, String imgPath, String imgType) {
this
.encoderQRCode(content,
imgPath, imgType,
7
);
}
/**
*
生成二维码(QRCode)图片
*
@param content 存储内容
*
@param output 输出流
*
@param imgType 图片类型
*/
public
void
encoderQRCode(String content, OutputStream output, String imgType) {
this
.encoderQRCode(content,
output, imgType,
7
);
}
/**
*
生成二维码(QRCode)图片
*
@param content 存储内容
*
@param imgPath 图片路径
*
@param imgType 图片类型
*
@param size 二维码尺寸
*/
public
void
encoderQRCode(String content, String imgPath, String imgType,
int
size)
{
try
{
BufferedImage
bufImg =
this
.qRCodeCommon(content,
imgType, size);
File
imgFile =
new
File(imgPath);
if
(!imgFile.exists())
{
imgFile.mkdirs();
}
ImageIO.write(bufImg,
imgType, imgFile);
}
catch
(Exception
e) {
e.printStackTrace();
}
}
/**
*
生成二维码(QRCode)图片
*
@param content 存储内容
*
@param output 输出流
*
@param imgType 图片类型
*
@param size 二维码尺寸
*/
public
void
encoderQRCode(String content, OutputStream output, String imgType,
int
size)
{
try
{
BufferedImage
bufImg =
this
.qRCodeCommon(content,
imgType, size);
ImageIO.write(bufImg,
imgType, output);
}
catch
(Exception
e) {
e.printStackTrace();
}
}
/**
*
生成二维码(QRCode)图片的公共方法
*
@param content 存储内容
*
@param imgType 图片类型
*
@param size 二维码尺寸
*
@return
*/
private
BufferedImage
qRCodeCommon(String content, String imgType,
int
size)
{
BufferedImage
bufImg =
null
;
try
{
Qrcode
qrcodeHandler =
new
Qrcode();
qrcodeHandler.setQrcodeErrorCorrect(
'M'
);
qrcodeHandler.setQrcodeEncodeMode(
'B'
);
qrcodeHandler.setQrcodeVersion(size);
byte
[]
contentBytes = content.getBytes(
"utf-8"
);
int
imgSize
=
67
+
12
*
(size -
1
);
bufImg
=
new
BufferedImage(imgSize,
imgSize, BufferedImage.TYPE_INT_RGB);
Graphics2D
gs = bufImg.createGraphics();
gs.setBackground(Color.WHITE);
gs.clearRect(
0
,
0
,
imgSize, imgSize);
gs.setColor(Color.BLACK);
int
pixoff
=
2
;
if
(contentBytes.length
>
0
&&
contentBytes.length <
800
)
{
boolean
[][]
codeOut = qrcodeHandler.calQrcode(contentBytes);
for
(
int
i
=
0
;
i < codeOut.length; i++) {
for
(
int
j
=
0
;
j < codeOut.length; j++) {
if
(codeOut[j][i])
{
gs.fillRect(j
*
3
+
pixoff, i *
3
+
pixoff,
3
,
3
);
}
}
}
}
else
{
throw
new
Exception(
"QRCode
content bytes length = "
+ contentBytes.length +
"
not in [0, 800]."
);
}
gs.dispose();
bufImg.flush();
}
catch
(Exception
e) {
e.printStackTrace();
}
return
bufImg;
}
/**
*
解析二维码(QRCode)
*
@param imgPath 图片路径
*
@return
*/
public
String
decoderQRCode(String imgPath) {
File
imageFile =
new
File(imgPath);
BufferedImage
bufImg =
null
;
String
content =
null
;
try
{
bufImg
= ImageIO.read(imageFile);
QRCodeDecoder
decoder =
new
QRCodeDecoder();
content
=
new
String(decoder.decode(
new
TwoDimensionCodeImage(bufImg)),
"utf-8"
);
}
catch
(IOException
e) {
System.out.println(
"Error:
"
+ e.getMessage());
e.printStackTrace();
}
catch
(DecodingFailedException
dfe) {
System.out.println(
"Error:
"
+ dfe.getMessage());
dfe.printStackTrace();
}
return
content;
}
/**
*
解析二维码(QRCode)
*
@param input 输入流
*
@return
*/
public
String
decoderQRCode(InputStream input) {
BufferedImage
bufImg =
null
;
String
content =
null
;
try
{
bufImg
= ImageIO.read(input);
QRCodeDecoder
decoder =
new
QRCodeDecoder();
content
=
new
String(decoder.decode(
new
TwoDimensionCodeImage(bufImg)),
"utf-8"
);
}
catch
(IOException
e) {
System.out.println(
"Error:
"
+ e.getMessage());
e.printStackTrace();
}
catch
(DecodingFailedException
dfe) {
System.out.println(
"Error:
"
+ dfe.getMessage());
dfe.printStackTrace();
}
return
content;
}
public
static
void
main(String[] args) {
String
imgPath =
"D:/aaa/Michael_QRCode.png"
;
TwoDimensionCode
handler =
new
TwoDimensionCode();
handler.encoderQRCode(encoderContent,
imgPath,
"png"
);
}
}