http://www.swetake.com/qr/
下載qrcode.jar ,用於產生二維碼,但不能解碼。
進入 http://www.swetake.com/qr/java/qr_java.html ,下載 qrcode_java0.50beta10.tar.gz,解壓後在lib目錄下的 qrcode.jar
即為用於產生二維碼的庫。
http://sourceforge.jp/projects/qrcode/
下載qrcode.jar ,用於解析二維碼。
進入 http://sourceforge.jp/projects/qrcode/releases/,下載 qrcode.zip,解壓後在
lib 目錄下的 qrcode.jar 即為用於解析二維碼的庫。
修改 qrcode.jar 的名字,分別加入 eclipse 工程的 lib 下.
產生二維碼的程式碼範例:
package qrcode;import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import com.swetake.util.Qrcode;public class GucasQRCodeEncoder {public static int max_data_size_small = 84;public static int max_data_size_large = 500;/** * * @param srcValue * @param qrcodePicfilePath * @return */public static boolean encode(String srcValue, String qrcodePicfilePath) {//return encode_500(srcValue, qrcodePicfilePath);return encode_84(srcValue, qrcodePicfilePath);}/** * Encoding the information to a QRCode, size of the information must be less than 84 byte. * @param srcValue * @param qrcodePicfilePath * @return */public static boolean encode_84(String srcValue, String qrcodePicfilePath) {int MAX_DATA_LENGTH = max_data_size_small; // 限制產生二維碼的資料最大大小byte[] d = srcValue.getBytes();int dataLength = d.length;int imageWidth = 113; /* 113是預先計算出來的. 注意:映像寬度必須比產生的二維碼映像寬度大,至少相等,否則,二維碼識別不出來 */int imageHeight = imageWidth;BufferedImage bi = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);Graphics2D g = bi.createGraphics();g.setBackground(Color.WHITE);g.clearRect(0, 0, imageWidth, imageHeight);g.setColor(Color.BLACK);if (dataLength > 0 && dataLength <= MAX_DATA_LENGTH) {/* 產生二維碼 */Qrcode qrcode = new Qrcode();qrcode.setQrcodeErrorCorrect('M'); // L, Q, H, 預設qrcode.setQrcodeEncodeMode('B'); // A, N, 預設qrcode.setQrcodeVersion(5); // 37位元組, (37-1)*3+2+3-1+1 = 113boolean[][] b = qrcode.calQrcode(d);int qrcodeDataLen = b.length;for (int i = 0; i < qrcodeDataLen; i++) {for (int j = 0; j < qrcodeDataLen; j++) {if (b[j][i]) {g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3); /* * 畫二維碼圖形, * 畫出的圖形寬度是 * ((qrcodeDataLen-1)*3+2) + * 3 -1 ; * 產生的image的寬度大小必須>=該值,外圍的1個像素用來標識此塊地區為二維碼 *//* * fillRect(int x, int y, int width, int height) 函數作用: * 填充指定的矩形。該矩形左邊和右邊位於 x 和 x + width - 1。頂邊和底邊位於 y 和 y + * height - 1。 得到的矩形覆蓋的地區寬度為 width 像素,高度為 height 像素。 * 使用圖形內容相關的使用中色彩填充該矩形。 參數: x - 要填充矩形的 x 座標。 y - 要填充矩形的 y * 座標。 width - 要填充矩形的寬度。 height - 要填充矩形的高度。 * * 參考:http://bk.chinaar.com/index.php?doc-view-2999 */}}}System.out.println("二維碼資料長度(位元組):" + qrcodeDataLen);} else {System.out.println("Generate QRCode image error! Data size is " + dataLength +", it is lager than 84 bytes.");return false;}g.dispose();bi.flush();/* generate image */File f = new File(qrcodePicfilePath);String suffix = f.getName().substring(f.getName().indexOf(".")+1, f.getName().length());try {ImageIO.write(bi, suffix, f); //"png"} catch (IOException ioe) {System.out.println("Generate QRCode image error!" + ioe.getMessage());return false;}return true;}/** * Encoding the information to a QRCode, size of the information must be less tah 500 byte. * @param srcValue * @param qrcodePicfilePath * @return */public static boolean encode_500(String srcValue, String qrcodePicfilePath) {int MAX_DATA_LENGTH = max_data_size_large; // 限制產生二維碼的資料最大大小. 500位元組的未經處理資料, 產生二維碼時, 是89寬度byte[] d = srcValue.getBytes();int dataLength = d.length;int imageWidth = 269; /* 269是預先計算出來的. 注意:映像寬度必須比產生的二維碼映像寬度大,至少相等,否則,二維碼識別不出來 */int imageHeight = imageWidth;BufferedImage bi = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);Graphics2D g = bi.createGraphics();g.setBackground(Color.WHITE);g.clearRect(0, 0, imageWidth, imageHeight);g.setColor(Color.BLACK);if (dataLength > 0 && dataLength <= MAX_DATA_LENGTH) {/* 產生二維碼 */Qrcode qrcode = new Qrcode();qrcode.setQrcodeErrorCorrect('M'); // L, Q, H, 預設qrcode.setQrcodeEncodeMode('B'); // A, N, 預設qrcode.setQrcodeVersion(18); // 0<= version <=40; 89位元組,// (89-1)*3+2+3-1+1 = 269boolean[][] b = qrcode.calQrcode(d);int qrcodeDataLen = b.length;for (int i = 0; i < qrcodeDataLen; i++) {for (int j = 0; j < qrcodeDataLen; j++) {if (b[j][i]) {g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3); /* * 畫二維碼圖形, * 畫出的圖形寬度是 * ((qrcodeDataLen-1)*3+2) + * 3 -1 = 136; * 產生的image的寬度大小必須>=(136+1),外圍的1個像素用來標識此塊地區為二維碼 *//* * fillRect(int x, int y, int width, int height) 函數作用: * 填充指定的矩形。該矩形左邊和右邊位於 x 和 x + width - 1。頂邊和底邊位於 y 和 y + * height - 1。 得到的矩形覆蓋的地區寬度為 width 像素,高度為 height 像素。 * 使用圖形內容相關的使用中色彩填充該矩形。 參數: x - 要填充矩形的 x 座標。 y - 要填充矩形的 y * 座標。 width - 要填充矩形的寬度。 height - 要填充矩形的高度。 * * 參考:http://bk.chinaar.com/index.php?doc-view-2999 */}}}System.out.println("二維碼資料長度(位元組):" + qrcodeDataLen);} else {return false;}g.dispose();bi.flush();/* generate image */File f = new File(qrcodePicfilePath);String suffix = f.getName().substring(f.getName().indexOf(".")+1, f.getName().length());System.out.println(suffix);try {ImageIO.write(bi, suffix, f); //"png"} catch (IOException ioe) {System.out.println("Generate QRCode image error!" + ioe.getMessage());return false;}return true;}public static void main(String[] args) throws Exception {String data = "家常菜郭林林家常菜郭林家常菜郭林郭林家常菜郭林家常菜郭林家常菜郭林郭林家常菜郭林郭林";System.out.println("位元組數: " + data.getBytes().length);GucasQRCodeEncoder.encode(data, "A.JPG");System.out.println(GucasQRCodeDecoder.decode("A.JPG"));}}
解析二維碼程式碼範例:
package qrcode;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import jp.sourceforge.qrcode.QRCodeDecoder;import jp.sourceforge.qrcode.data.QRCodeImage;public class GucasQRCodeDecoder {public GucasQRCodeDecoder() {}/** * decode qrcode image. * @param qrcodePicfilePath * @return decoding value. */public static String decode(String qrcodePicfilePath) {/* 讀取二維碼映像資料 */File imageFile = new File(qrcodePicfilePath);BufferedImage image = null;try {image = ImageIO.read(imageFile);} catch (IOException e) {System.out.println("Decoding failed, read QRCode image error: " + e.getMessage());return null;}/*try {String decodedData = new String(decoder.decode(new J2SEImageGucas(image)), "GBK");System.out.println(decodedData);} catch (DecodingFailedException dfe) {System.out.println("Error: " + dfe.getMessage());} catch (UnsupportedEncodingException e) {e.printStackTrace();}*//* 解二維碼 */QRCodeDecoder decoder = new QRCodeDecoder();String decodedData = new String(decoder.decode(new J2SEImageGucas(image)));return decodedData;}public static void main(String[] args) {QRCodeDecoder decoder = new QRCodeDecoder();File imageFile = new File("qrcode//TestQRCode.png");BufferedImage image = null;try {image = ImageIO.read(imageFile);} catch (IOException e) {System.out.println("Error: " + e.getMessage());}System.out.println("識別二維碼");/*try {String decodedData = new String(decoder.decode(new J2SEImageGucas(image)), "GBK");System.out.println(decodedData);} catch (DecodingFailedException dfe) {System.out.println("Error: " + dfe.getMessage());} catch (UnsupportedEncodingException e) {e.printStackTrace();}*/String decodedData = new String(decoder.decode(new J2SEImageGucas(image)));System.out.println(decodedData);}}class J2SEImageGucas implements QRCodeImage {BufferedImage image;public J2SEImageGucas(BufferedImage image) {this.image = image;}public int getWidth() {return image.getWidth();}public int getHeight() {return image.getHeight();}public int getPixel(int x, int y) {return image.getRGB(x, y);}}