搜尋
首頁Javajava教程Java利用Zxing產生二維碼的簡單實例

Zxing是Google提供的關於條碼(一維碼、二維碼)的解析工具,提供了二維碼的生成與解析的方法,現在我簡單介紹一下使用Java利用Zxing生成與解析二維碼

1.二維碼的產生

1.1 將Zxing-core.jar 套件加入到classpath下。

1.2 二維碼的產生需要藉助MatrixToImageWriter類,該類是由Google提供的,可以將該類拷貝到源碼中,這裡我將該類的源碼貼上,可以直接使用。

import com.google.zxing.common.BitMatrix;
  
 import javax.imageio.ImageIO;
 import java.io.File;
 import java.io.OutputStream;
 import java.io.IOException;
 import java.awt.image.BufferedImage;
  
  
 public final class MatrixToImageWriter {
  
  private static final int BLACK = 0xFF000000;
  private static final int WHITE = 0xFFFFFFFF;
  
  private MatrixToImageWriter() {}
  
   
  public static BufferedImage toBufferedImage(BitMatrix matrix) {
   int width = matrix.getWidth();
   int height = matrix.getHeight();
   BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
   for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
     image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
    }
   }
   return image;
  }
  
   
  public static void writeToFile(BitMatrix matrix, String format, File file)
    throws IOException {
   BufferedImage image = toBufferedImage(matrix);
   if (!ImageIO.write(image, format, file)) {
    throw new IOException("Could not write an image of format " + format + " to " + file);
   }
  }
  
   
  public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)
    throws IOException {
   BufferedImage image = toBufferedImage(matrix);
   if (!ImageIO.write(image, format, stream)) {
    throw new IOException("Could not write an image of format " + format);
   }
  }
  
 }

1.3 編寫產生二維碼的實作程式碼

try {
        
   String content = "120605181003;http://www.cnblogs.com/jtmjx";
   String path = "C:/Users/Administrator/Desktop/testImage";
    
   MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    
   Map hints = new HashMap();
   hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
   BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400,hints);
   File file1 = new File(path,"餐巾纸.jpg");
   MatrixToImageWriter.writeToFile(bitMatrix, "jpg", file1);
    
 } catch (Exception e) {
   e.printStackTrace();
 }

現在運作後即可產生一張二維碼圖片,是不是很簡單啊? 接下來我們來看看如何解析二維碼

2、二維碼的解析

2.1 將Zxing-core.jar 套件加入到classpath下。

2.2 和生成一樣,我們需要一個輔助類( BufferedImageLuminanceSource),同樣該類Google也提供了,這裡我同樣將該類的源碼貼出來,可以直接拷貝使用個,省去查找的麻煩

BufferedImageLuminanceSource 
 import com.google.zxing.LuminanceSource;
  
 import java.awt.Graphics2D;
 import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
  
 public final class BufferedImageLuminanceSource extends LuminanceSource {
  
  private final BufferedImage image;
  private final int left;
  private final int top;
  
  public BufferedImageLuminanceSource(BufferedImage image) {
   this(image, 0, 0, image.getWidth(), image.getHeight());
  }
  
  public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) {
   super(width, height);
  
   int sourceWidth = image.getWidth();
   int sourceHeight = image.getHeight();
   if (left + width > sourceWidth || top + height > sourceHeight) {
    throw new IllegalArgumentException("Crop rectangle does not fit within image data.");
   }
  
   for (int y = top; y < top + height; y++) {
    for (int x = left; x < left + width; x++) {
     if ((image.getRGB(x, y) & 0xFF000000) == 0) {
      image.setRGB(x, y, 0xFFFFFFFF); // = white
     }
    }
   }
  
   this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);
   this.image.getGraphics().drawImage(image, 0, 0, null);
   this.left = left;
   this.top = top;
  }
  
  @Override
  public byte[] getRow(int y, byte[] row) {
   if (y < 0 || y >= getHeight()) {
    throw new IllegalArgumentException("Requested row is outside the image: " + y);
   }
   int width = getWidth();
   if (row == null || row.length < width) {
    row = new byte[width];
   }
   image.getRaster().getDataElements(left, top + y, width, 1, row);
   return row;
  }
  
  @Override
  public byte[] getMatrix() {
   int width = getWidth();
   int height = getHeight();
   int area = width * height;
   byte[] matrix = new byte[area];
   image.getRaster().getDataElements(left, top, width, height, matrix);
   return matrix;
  }
  
  @Override
  public boolean isCropSupported() {
   return true;
  }
  
  @Override
  public LuminanceSource crop(int left, int top, int width, int height) {
   return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);
  }
  
  @Override
  public boolean isRotateSupported() {
   return true;
  }
  
  @Override
  public LuminanceSource rotateCounterClockwise() {
  
    int sourceWidth = image.getWidth();
   int sourceHeight = image.getHeight();
  
   AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);
  
   BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);
  
   Graphics2D g = rotatedImage.createGraphics();
   g.drawImage(image, transform, null);
   g.dispose();
  
   int width = getWidth();
   return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);
  }
  
 }

2.3編寫解析二維碼的實作程式碼

try {
             MultiFormatReader formatReader = new MultiFormatReader();
       String filePath = "C:/Users/Administrator/Desktop/testImage/test.jpg";
       File file = new File(filePath);
       BufferedImage image = ImageIO.read(file);;
       LuminanceSource source = new BufferedImageLuminanceSource(image);
       Binarizer binarizer = new HybridBinarizer(source);
       BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
       Map hints = new HashMap();
       hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
       Result result = formatReader.decode(binaryBitmap,hints);
        
             System.out.println("result = "+ result.toString());
       System.out.println("resultFormat = "+ result.getBarcodeFormat());
       System.out.println("resultText = "+ result.getText());
              
     } catch (Exception e) {
       e.printStackTrace();
     }

現在運行後可以看到控制台印出了二維碼的內容。

到此為止,利用Zxing產生和解析二維碼就講述演示完畢,主要為自己做備忘,同時方便有需要的人。

以上這篇Java利用Zxing生成二維碼的簡單實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。

更多Java利用Zxing產生二維碼的簡單實例相關文章請關注PHP中文網!


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境