Java가 Zxing을 이용하여 QR코드를 생성하는 간단한 사례

7693 단어 javazxingQR코드
Zxing은 Google에서 제공하는 바코드(1차원 코드, QR코드)에 대한 해석 도구로 QR코드의 생성과 해석 방법을 제공합니다. 지금 저는 Java를 이용하여 Zxing을 이용하여 QR코드를 생성하고 해석하는 방법을 간단하게 소개합니다.
1. QR코드의 생성
1.1 Zxing-core.jar 패키지를classpath에 추가합니다.
1.2 QR코드의 생성은 Matrix To Image Writer 클래스를 사용해야 합니다. 이 클래스는 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 QR코드 생성의 실현 코드 작성

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();
 }
지금 실행하면 QR코드 그림을 만들 수 있습니다. 간단하지 않습니까?다음은 QR코드를 어떻게 해석하는지 보도록 하겠습니다.
2. QR코드의 해석
2.1 Zxing-core.jar 패키지를classpath에 추가합니다.  
2.2 생성과 마찬가지로 우리는 보조 클래스(Buffered Image Luminance Source)가 필요합니다. 같은 종류의 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 QR코드의 실현 코드 작성

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();
     }
지금 실행하면 콘솔에서 QR 코드의 내용을 출력하는 것을 볼 수 있습니다.
지금까지 Zxing을 이용하여 QR코드를 생성하고 해석하면 설명이 끝났고 주로 자신을 위해 메모를 하는 동시에 필요한 사람을 편리하게 한다.허허!
이상의 이 자바가 Zxing을 이용하여 QR코드를 생성한 간단한 실례는 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기