參考代碼
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出趙縣免費(fèi)做網(wǎng)站回饋大家。
import java.io.*;
import java.util.Date;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
public class QRCodeEncoderTest
{
/** Creates a new instance of QRCodeEncoderTest */
public QRCodeEncoderTest()
{
}
public static void create_image(String sms_info)throws Exception{
try{
qrcode testQrcode =new qrcode();
testQrcode.setQrcodeErrorCorrect('M');
testQrcode.setQrcodeEncodeMode('B');
testQrcode.setQrcodeVersion(7);
String testString = sms_info;
byte[] d = testString.getBytes("gbk");
System.out.println(d.length);
//BufferedImage bi = new BufferedImage(98, 98, BufferedImage.TYPE_INT_RGB);
BufferedImage bi = new BufferedImage(98, 98, BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g = bi.createGraphics();
g.setBackground(Color.WHITE);
g.clearRect(0, 0, 98, 98);
g.setColor(Color.BLACK);
// 限制最大字節(jié)數(shù)為120
if (d.length0 d.length 120){
boolean[][] s = testQrcode.calQrcode(d);
for (int i=0;is.length;i++){
for (int j=0;js.length;j++){
if (s[j][i]) {
g.fillRect(j*2+3,i*2+3,2,2);
}
}
}
}
g.dispose();
bi.flush();
File f = new File("D:\\QRCodeTest\\"+sms_info+".jpg");
if(!f.exists()){
f.createNewFile();
}
//創(chuàng)建圖片
ImageIO.write(bi, "jpg", f);
} // end try
catch (Exception e) {
e.printStackTrace();
} // end catch
}
public static void main(String[] args) throws Exception {
System.out.println(new Date());
for(int i =1; i 100000; i ++){
QRCodeEncoderTest.create_image(i+"");
}
System.out.println(new Date());
} // end main
}
package?common;
import?java.awt.Color;
import?java.awt.Graphics2D;
import?java.awt.Image;
import?java.awt.image.BufferedImage;
import?java.io.File;
import?java.io.IOException;
import?java.util.HashMap;
import?java.util.Map;
import?javax.imageio.ImageIO;
import?jp.sourceforge.qrcode.QRCodeDecoder;
import?jp.sourceforge.qrcode.exception.DecodingFailedException;
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.NotFoundException;
import?com.google.zxing.WriterException;
import?com.google.zxing.common.BitMatrix;
import?com.google.zxing.common.HybridBinarizer;
import?com.swetake.util.Qrcode;
/**
*?二維碼生成工具類
*?@author?Cloud
*?@data???2016-12-15
*?QRCode
*/
public?class?QRCodeUtil?{
//二維碼顏色
private?static?final?int?BLACK?=?0xFF000000;
//二維碼顏色
private?static?final?int?WHITE?=?0xFFFFFFFF;
/**
*?span?style="font-size:18px;font-weight:blod;"ZXing?方式生成二維碼/span
*?@param?text????a?href="javascript:void();"二維碼內(nèi)容/a
*?@param?width????二維碼寬
*?@param?height????二維碼高
*?@param?outPutPath????二維碼生成保存路徑
*?@param?imageType????????二維碼生成格式
*/
public?static?void?zxingCodeCreate(String?text,?int?width,?int?height,?String?outPutPath,?String?imageType){
MapEncodeHintType,?String?his?=?new?HashMapEncodeHintType,?String();
//設(shè)置編碼字符集
his.put(EncodeHintType.CHARACTER_SET,?"utf-8");
try?{
//1、生成二維碼
BitMatrix?encode?=?new?MultiFormatWriter().encode(text,?BarcodeFormat.QR_CODE,?width,?height,?his);
//2、獲取二維碼寬高
int?codeWidth?=?encode.getWidth();
int?codeHeight?=?encode.getHeight();
//3、將二維碼放入緩沖流
BufferedImage?image?=?new?BufferedImage(codeWidth,?codeHeight,?BufferedImage.TYPE_INT_RGB);
for?(int?i?=?0;?i??codeWidth;?i++)?{
for?(int?j?=?0;?j??codeHeight;?j++)?{
//4、循環(huán)將二維碼內(nèi)容定入圖片
image.setRGB(i,?j,?encode.get(i,?j)???BLACK?:?WHITE);
}
}
File?outPutImage?=?new?File(outPutPath);
//如果圖片不存在創(chuàng)建圖片
if(!outPutImage.exists())
outPutImage.createNewFile();
//5、將二維碼寫(xiě)入圖片
ImageIO.write(image,?imageType,?outPutImage);
}?catch?(WriterException?e)?{
e.printStackTrace();
System.out.println("二維碼生成失敗");
}?catch?(IOException?e)?{
e.printStackTrace();
System.out.println("生成二維碼圖片失敗");
}
}
/**
*?span?style="font-size:18px;font-weight:blod;"二維碼解析/span
*?@param?analyzePath????二維碼路徑
*?@return
*?@throws?IOException
*/
@SuppressWarnings({?"rawtypes",?"unchecked"?})
public?static?Object?zxingCodeAnalyze(String?analyzePath)?throws?Exception{
MultiFormatReader?formatReader?=?new?MultiFormatReader();
Object?result?=?null;
try?{
File?file?=?new?File(analyzePath);
if?(!file.exists())
{
return?"二維碼不存在";
}
BufferedImage?image?=?ImageIO.read(file);
LuminanceSource?source?=?new?LuminanceSourceUtil(image);
Binarizer?binarizer?=?new?HybridBinarizer(source);??
BinaryBitmap?binaryBitmap?=?new?BinaryBitmap(binarizer);
Map?hints?=?new?HashMap();
hints.put(EncodeHintType.CHARACTER_SET,?"UTF-8");
result?=?formatReader.decode(binaryBitmap,?hints);
}?catch?(NotFoundException?e)?{
e.printStackTrace();
}??
return?result;
}
/**
*?span?style="font-size:18px;font-weight:blod;"QRCode?方式生成二維碼/span
*?@param?content????二維碼內(nèi)容
*?@param?imgPath????二維碼生成路徑
*?@param?version????二維碼版本
*?@param?isFlag????是否生成Logo圖片????為NULL不生成
*/
public?static?void?QRCodeCreate(String?content,?String?imgPath,?int?version,?String?logoPath){
try?{??
Qrcode?qrcodeHandler?=?new?Qrcode();??
//設(shè)置二維碼排錯(cuò)率,可選L(7%)?M(15%)?Q(25%)?H(30%),排錯(cuò)率越高可存儲(chǔ)的信息越少,但對(duì)二維碼清晰度的要求越小????
qrcodeHandler.setQrcodeErrorCorrect('M');??
//N代表數(shù)字,A代表字符a-Z,B代表其他字符??
qrcodeHandler.setQrcodeEncodeMode('B');??
//版本1為21*21矩陣,版本每增1,二維碼的兩個(gè)邊長(zhǎng)都增4;所以版本7為45*45的矩陣;最高版本為是40,是177*177的矩陣??
qrcodeHandler.setQrcodeVersion(version);
//根據(jù)版本計(jì)算尺寸
int?imgSize?=?67?+?12?*?(version?-?1)?;??
byte[]?contentBytes?=?content.getBytes("gb2312");??
BufferedImage?bufImg?=?new?BufferedImage(imgSize?,?imgSize?,BufferedImage.TYPE_INT_RGB);??
Graphics2D?gs?=?bufImg.createGraphics();??
gs.setBackground(Color.WHITE);??
gs.clearRect(0,?0,?imgSize?,?imgSize);??
//?設(shè)定圖像顏色??BLACK
gs.setColor(Color.BLACK);
//?設(shè)置偏移量?不設(shè)置可能導(dǎo)致解析出錯(cuò)??
int?pixoff?=?2;
//?輸出內(nèi)容??二維碼??
if?(contentBytes.length??0??contentBytes.length??130)?{
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?{??
System.err.println("QRCode?content?bytes?length?=?"?+?contentBytes.length?+?"?not?in?[?0,130?].?");??
}
/*?判斷是否需要添加logo圖片?*/
if(logoPath?!=?null){
File?icon?=?new?File(logoPath);
if(icon.exists()){
int?width_4?=?imgSize?/?4;
int?width_8?=?width_4?/?2;
int?height_4?=?imgSize?/?4;
int?height_8?=?height_4?/?2;
Image?img?=?ImageIO.read(icon);
gs.drawImage(img,?width_4?+?width_8,?height_4?+?height_8,width_4,height_4,?null);
gs.dispose();
bufImg.flush();
}else{
System.out.println("Error:?login圖片還在在!");
}
}
gs.dispose();
bufImg.flush();
//創(chuàng)建二維碼文件
File?imgFile?=?new?File(imgPath);
if(!imgFile.exists())
imgFile.createNewFile();
//根據(jù)生成圖片獲取圖片
String?imgType?=?imgPath.substring(imgPath.lastIndexOf(".")?+?1,?imgPath.length());
//?生成二維碼QRCode圖片??
ImageIO.write(bufImg,?imgType,?imgFile);??
}?catch?(Exception?e)?{??
e.printStackTrace();??
}
}
/**
*?span?style="font-size:18px;font-weight:blod;"QRCode二維碼解析/span
*?@param?codePath????二維碼路徑
*?@return????解析結(jié)果
*/
public?static?String?QRCodeAnalyze(String?codePath)?{
File?imageFile?=?new?File(codePath);
BufferedImage?bufImg?=?null;??
String?decodedData?=?null;??
try?{
if(!imageFile.exists())
return?"二維碼不存在";
bufImg?=?ImageIO.read(imageFile);
QRCodeDecoder?decoder?=?new?QRCodeDecoder();??
decodedData?=?new?String(decoder.decode(new?ImageUtil(bufImg)),?"gb2312");??
}?catch?(IOException?e)?{??
System.out.println("Error:?"?+?e.getMessage());??
e.printStackTrace();??
}?catch?(DecodingFailedException?dfe)?{??
System.out.println("Error:?"?+?dfe.getMessage());??
dfe.printStackTrace();??
}
return?decodedData;
}
}
3、最后貼測(cè)試代碼:
package?test;
import?java.awt.image.BufferedImage;
import?java.io.InputStream;
import?java.net.URL;
import?javax.imageio.ImageIO;
import?common.ImageUtil;
import?common.QRCodeUtil;
import?jp.sourceforge.qrcode.QRCodeDecoder;
/**
*?二維碼生成測(cè)試類
*?@author?Cloud
*?@data???2016-11-21
*?QRCodeTest
*/
public?class?QRCodeTest?{
public?static?void?main(String[]?args)?throws?Exception?{
/**
*????QRcode?二維碼生成測(cè)試
*????QRCodeUtil.QRCodeCreate("",?"E://qrcode.jpg",?15,?"E://icon.png");
*/
/**
*?????QRcode?二維碼解析測(cè)試
*????String?qrcodeAnalyze?=?QRCodeUtil.QRCodeAnalyze("E://qrcode.jpg");
*/
/**
*?ZXingCode?二維碼生成測(cè)試
*?QRCodeUtil.zxingCodeCreate("",?300,?300,?"E://zxingcode.jpg",?"jpg");
*/
/**
*?ZxingCode?二維碼解析
*????String?zxingAnalyze?=??QRCodeUtil.zxingCodeAnalyze("E://zxingcode.jpg").toString();
*/
System.out.println("success");
}
}
1: 使用SwetakeQRCode在Java項(xiàng)目中生成二維碼
下載地址
或著
這個(gè)是日本人寫(xiě)的,生成的是我們常見(jiàn)的方形的二維碼
可以用中文
如:5677777ghjjjjj
2: 使用BarCode4j生成條形碼和二維碼
BarCode4j網(wǎng)址:
barcode4j是使用datamatrix的二維碼生成算法,為支持qr的算法
datamatrix是歐美的標(biāo)準(zhǔn),qr為日本的標(biāo)準(zhǔn),
barcode4j一般生成出來(lái)是長(zhǎng)方形的
如:88777alec000yan
這個(gè)博客這方面說(shuō)的挺清楚的:
3:zxing
zxing 這個(gè)是google的
下載地址
Java代碼:
import java.io.File;
import java.util.Hashtable;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
public class QRCodeEvents {
public static void main(String []args)throws Exception{
String text = "你好";
int width = 100;
int height = 100;
String format = "png";
Hashtable hints= new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height,hints);
File outputFile = new File("new.png");
MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile);
}
}
4:google chart api就有實(shí)現(xiàn)二維碼的方法
利用這個(gè)api,使用google appengine進(jìn)行實(shí)現(xiàn)。
5:JS生成二維碼
使用jQuery-qrcode生成二維碼
先簡(jiǎn)單說(shuō)一下jquery-qrcode,這個(gè)開(kāi)源的三方庫(kù)(可以從 獲取),
qrcode.js 是實(shí)現(xiàn)二維碼數(shù)據(jù)計(jì)算的核心類,
jquery.qrcode.js 是把它用jquery方式封裝起來(lái)的,用它來(lái)實(shí)現(xiàn)圖形渲染,其實(shí)就是畫(huà)圖(支持canvas和table兩種方式)
支持的功能主要有:
Js代碼:
text : "" //設(shè)置二維碼內(nèi)容
Js代碼:
render : "canvas",//設(shè)置渲染方式
width : 256, //設(shè)置寬度
height : 256, //設(shè)置高度
typeNumber : -1, //計(jì)算模式
correctLevel : QRErrorCorrectLevel.H,//糾錯(cuò)等級(jí)
background : "#ffffff",//背景顏色
foreground : "#000000" //前景顏色
使用方式非常簡(jiǎn)單
Js代碼:
jQuery('#output').qrcode({width:200,height:200,correctLevel:0,text:content});
經(jīng)過(guò)簡(jiǎn)單實(shí)踐,
使用canvas方式渲染性能還是非常不錯(cuò)的,但是如果用table方式,性能不太理想,特別是IE9以下的瀏覽器,所以需要自行優(yōu)化一下渲染table的方式,這里就不細(xì)述了。
其實(shí)上面的js有一個(gè)小小的缺點(diǎn),就是默認(rèn)不支持中文。
這跟js的機(jī)制有關(guān)系,jquery-qrcode這個(gè)庫(kù)是采用 charCodeAt() 這個(gè)方式進(jìn)行編碼轉(zhuǎn)換的,
而這個(gè)方法默認(rèn)會(huì)獲取它的 Unicode 編碼,一般的解碼器都是采用UTF-8, ISO-8859-1等方式,
英文是沒(méi)有問(wèn)題,如果是中文,一般情況下Unicode是UTF-16實(shí)現(xiàn),長(zhǎng)度2位,而UTF-8編碼是3位,這樣二維碼的編解碼就不匹配了。
解決方式當(dāng)然是,在二維碼編碼前把字符串轉(zhuǎn)換成UTF-8,具體代碼如下:
function utf16to8(str) {
var out, i, len, c;
out = "";
len = str.length;
for(i = 0; i len; i++) {
c = str.charCodeAt(i);
if ((c = 0x0001) (c = 0x007F)) {
out += str.charAt(i);
} else if (c 0x07FF) {
out += String.fromCharCode(0xE0 | ((c 12) 0x0F));
out += String.fromCharCode(0x80 | ((c 6) 0x3F));
out += String.fromCharCode(0x80 | ((c 0) 0x3F));
} else {
out += String.fromCharCode(0xC0 | ((c 6) 0x1F));
out += String.fromCharCode(0x80 | ((c 0) 0x3F));
}
}
return out;
}