1. 程式人生 > >zxing生成帶logo的二維碼

zxing生成帶logo的二維碼

首先說下,QRCode是日本人開發的,ZXing是google開發,barcode4j也是老美開發的,barcode4j對一維條形碼處理的很好,而且支援的格式很多,當然也可以對二維碼進行處理,效果個人感覺沒有前兩種好;ZXing對j2me,j2se,還有Android等支援也比較好,如果你是搞Android的或以後準備走Android,建議還是用zxing的比較好,畢竟都一個母親(goole)生的,QRCode就不用說了吧,雖說技術無國界,但是國人還是有點...。

好,言歸正傳,java用ZXing開發二維碼,首先需要新增code.jar包,這個包需要自己生成下,官網下載ZXing-2.3.0(目前最新的)後,解壓 把code中的程式碼拷貝到一個工程中生成jar包。ZXing-code-2.3.0.jar包和原始碼包本人已編譯後,不想自己重新編譯下的可以直接下載使用的,下面的程式碼就是使用這個jar包的,ZXing-code-2.3.0.jar下載地址:

http://download.csdn.net/detail/sanfye/8704583  

ZXing 生成二維碼

二維碼的生成可以參考Google程式碼測試包中的MatrixToImageWriter類來輔助開發,可以將該類直接拷貝到原始碼中使用 (code/src/test/java ),當然你也可以自己寫個,個人感覺沒必要所以就直接考過來用了。另外,在生成帶圖片的二維碼時要注意下,引數中設定的容錯級別儘量設定到最高,以免出現無法解析的情況:hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

  1. import java.awt.image.BufferedImage;

  2. import java.io.File;

  3. import java.io.IOException;

  4. import java.io.OutputStream;

  5. import javax.imageio.ImageIO;

  6. import com.google.zxing.common.BitMatrix;

  7. /**

  8. * 二維碼的生成需要藉助MatrixToImageWriter類,該類是由Google提供的,可以將該類直接拷貝到原始碼中使用,當然你也可以自己寫個

  9. * 生產條形碼的基類

  10. */

  11. public class MatrixToImageWriter {

  12. private static final int BLACK = 0xFF000000;//用於設定圖案的顏色

  13. private static final int WHITE = 0xFFFFFFFF; //用於背景色

  14. private MatrixToImageWriter() {

  15. }

  16. public static BufferedImage toBufferedImage(BitMatrix matrix) {

  17. int width = matrix.getWidth();

  18. int height = matrix.getHeight();

  19. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

  20. for (int x = 0; x < width; x++) {

  21. for (int y = 0; y < height; y++) {

  22. image.setRGB(x, y, (matrix.get(x, y) ? BLACK : WHITE));

  23. // image.setRGB(x, y, (matrix.get(x, y) ? Color.YELLOW.getRGB() : Color.CYAN.getRGB()));

  24. }

  25. }

  26. return image;

  27. }

  28. public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {

  29. BufferedImage image = toBufferedImage(matrix);

  30. //設定logo圖示

  31. LogoConfig logoConfig = new LogoConfig();

  32. image = logoConfig.LogoMatrix(image);

  33. if (!ImageIO.write(image, format, file)) {

  34. throw new IOException("Could not write an image of format " + format + " to " + file);

  35. }else{

  36. System.out.println("圖片生成成功!");

  37. }

  38. }

  39. public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {

  40. BufferedImage image = toBufferedImage(matrix);

  41. //設定logo圖示

  42. LogoConfig logoConfig = new LogoConfig();

  43. image = logoConfig.LogoMatrix(image);

  44. if (!ImageIO.write(image, format, stream)) {

  45. throw new IOException("Could not write an image of format " + format);

  46. }

  47. }

  48. }

操作類:

  1. import java.io.File;

  2. import java.io.IOException;

  3. import java.util.Hashtable;

  4. import com.google.zxing.BarcodeFormat;

  5. import com.google.zxing.EncodeHintType;

  6. import com.google.zxing.MultiFormatWriter;

  7. import com.google.zxing.WriterException;

  8. import com.google.zxing.common.BitMatrix;

  9. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

  10. import com.utils.code.MatrixToImageWriter;

  11. public class EncodeTest {

  12. public static void Encode_QR_CODE() throws IOException, WriterException{

  13. String contents = "ZXing 二維碼內容1234!"; // 二維碼內容

  14. int width = 430; // 二維碼圖片寬度 300

  15. int height = 430; // 二維碼圖片高度300

  16. String format = "gif";// 二維碼的圖片格式 gif

  17. Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();

  18. // 指定糾錯等級,糾錯級別(L 7%、M 15%、Q 25%、H 30%)

  19. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

  20. // 內容所使用字符集編碼

  21. hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

  22. // hints.put(EncodeHintType.MAX_SIZE, 350);//設定圖片的最大值

  23. // hints.put(EncodeHintType.MIN_SIZE, 100);//設定圖片的最小值

  24. hints.put(EncodeHintType.MARGIN, 1);//設定二維碼邊的空度,非負數

  25. BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,//要編碼的內容

  26. //編碼型別,目前zxing支援:Aztec 2D,CODABAR 1D format,Code 39 1D,Code 93 1D ,Code 128 1D,

  27. //Data Matrix 2D , EAN-8 1D,EAN-13 1D,ITF (Interleaved Two of Five) 1D,

  28. //MaxiCode 2D barcode,PDF417,QR Code 2D,RSS 14,RSS EXPANDED,UPC-A 1D,UPC-E 1D,UPC/EAN extension,UPC_EAN_EXTENSION

  29. BarcodeFormat.QR_CODE,

  30. width, //條形碼的寬度

  31. height, //條形碼的高度

  32. hints);//生成條形碼時的一些配置,此項可選

  33. // 生成二維碼

  34. File outputFile = new File("d:" + File.separator + "new-1.gif");//指定輸出路徑

  35. MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile);

  36. }

  37. public static void main(String[] args) throws Exception {

  38. try {

  39. Encode_QR_CODE();

  40. } catch (Exception e) {

  41. // TODO: handle exception

  42. e.printStackTrace();

  43. }

  44. }

  45. }

LogoConfig類,主要處理logo圖示已達到和微信自動的二維碼相近的效果

  1. import java.awt.BasicStroke;

  2. import java.awt.Color;

  3. import java.awt.Graphics2D;

  4. import java.awt.geom.RoundRectangle2D;

  5. import java.awt.image.BufferedImage;

  6. import java.io.File;

  7. import java.io.IOException;

  8. import javax.imageio.ImageIO;

  9. /**

  10. * 二維碼 新增 logo圖示 處理的方法,

  11. * 模仿微信自動生成二維碼效果,有圓角邊框,logo和二維碼間有空白區,logo帶有灰色邊框

  12. * @author Administrator sangwenhao

  13. *

  14. */

  15. public class LogoConfig {

  16. /**

  17. * 設定 logo

  18. * @param matrixImage 源二維碼圖片

  19. * @return 返回帶有logo的二維碼圖片

  20. * @throws IOException

  21. * @author Administrator sangwenhao

  22. */

  23. public BufferedImage LogoMatrix(BufferedImage matrixImage) throws IOException{

  24. /**

  25. * 讀取二維碼圖片,並構建繪圖物件

  26. */

  27. Graphics2D g2 = matrixImage.createGraphics();

  28. int matrixWidth = matrixImage.getWidth();

  29. int matrixHeigh = matrixImage.getHeight();

  30. /**

  31. * 讀取Logo圖片

  32. */

  33. BufferedImage logo = ImageIO.read(new File("D:\\logo.jpg"));

  34. //開始繪製圖片

  35. g2.drawImage(logo,matrixWidth/5*2,matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5, null);//繪製

  36. BasicStroke stroke = new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);

  37. g2.setStroke(stroke);// 設定筆畫物件

  38. //指定弧度的圓角矩形

  39. RoundRectangle2D.Float round = new RoundRectangle2D.Float(matrixWidth/5*2, matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5,20,20);

  40. g2.setColor(Color.white);

  41. g2.draw(round);// 繪製圓弧矩形

  42. //設定logo 有一道灰色邊框

  43. BasicStroke stroke2 = new BasicStroke(1,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);

  44. g2.setStroke(stroke2);// 設定筆畫物件

  45. RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(matrixWidth/5*2+2, matrixHeigh/5*2+2, matrixWidth/5-4, matrixHeigh/5-4,20,20);

  46. g2.setColor(new Color(128,128,128));

  47. g2.draw(round2);// 繪製圓弧矩形

  48. g2.dispose();

  49. matrixImage.flush() ;

  50. return matrixImage ;

  51. }

  52. }