以前QR碼剛開始火的時候,曾試驗過google的zxing project,解碼是沒問題的,編碼沒有範例代碼,當時測試的時候發現其中的zxing.appspot.com工程是用來生成QR圖片的,結果安裝好運行之後才知道,它是通過chart.apis.google.com提供的接口來實現的。
最近因項目需要,花了點時間閱讀zxing的javadoc,同時參考了網上的一些文章,寫了一個servlet,可以完全取代chart.apis.google.com自行生成QR圖片,有了這個servlet,不需要去訪問google的服務器也可以在網頁中內嵌URL在線顯示QR圖片了。
以下是servlet的代碼:
package testQR;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
@SuppressWarnings("serial")
public class QRCode extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
int onColor = 0xFF000000;
int offColor = 0xFFFFFFFF;
int intX = 320;
int intY = 320;
String sErr = "L";
String sEnc = "UTF-8";
String content = "Nothing";
String[] strarry = request.getQueryString().split("&");
for (String s : strarry) {
if (s.startsWith("chs=")) {
String[] sDemi = s.substring(4).split("x");
intX = Integer.parseInt(sDemi[0]);
intY = Integer.parseInt(sDemi[1]);
} else if (s.startsWith("chcl=")) {
onColor = Integer.parseInt(s.substring(5,11), 16)|0xFF000000;
offColor = Integer.parseInt(s.substring(11), 16)|0xFF000000;
} else if (s.startsWith("chld=")) {
sErr = s.substring(5);
} else if (s.startsWith("choe=")) {
sEnc = s.substring(5);
} else if (s.startsWith("chl=")) {
content = URLDecoder.decode(s.substring(4),sEnc);
}
}
Map hints = new HashMap();
ErrorCorrectionLevel lErr;
if (sErr.equals("H")) lErr = ErrorCorrectionLevel.H;
else if (sErr.equals("Q")) lErr = ErrorCorrectionLevel.Q;
else if (sErr.equals("M")) lErr = ErrorCorrectionLevel.M;
else lErr = ErrorCorrectionLevel.L;
hints.put(EncodeHintType.ERROR_CORRECTION, lErr);
hints.put(EncodeHintType.CHARACTER_SET, sEnc);
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Cache-Control","no-store");
response.setContentType("image/png");
ServletOutputStream rsp = response.getOutputStream();
QRCodeWriter qrWriter = new QRCodeWriter();
try {
BitMatrix bitMatrix = qrWriter.encode(content, BarcodeFormat.QR_CODE, intX, intY,hints);
MatrixToImageWriter.writeToStream(bitMatrix, "png", rsp, new MatrixToImageConfig(onColor, offColor));
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rsp.flush();
rsp.close();
response.flushBuffer();
}
}
項目依賴:zxing裏的core.jar、javase.jar