使用 Java 產生二維碼映像,解析二維碼映像.

來源:互聯網
上載者:User

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);}}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.