Home Java javaTutorial A simple example of Java using Zxing to generate QR code

A simple example of Java using Zxing to generate QR code

Jan 07, 2017 am 10:58 AM

Zxing is a barcode (one-dimensional code, two-dimensional code) parsing tool provided by Google. It provides methods for generating and parsing QR codes. Now I will briefly introduce how to use Zxing to generate and parse QR codes using Java.

1. QR code generation

1.1 Add the Zxing-core.jar package to the classpath.

1.2 The generation of QR code requires the help of the MatrixToImageWriter class, which is provided by Google. You can copy this class into the source code. Here I paste the source code of this class, which can be used directly.

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);
   }
  }
  
 }
Copy after login

1.3 Write the implementation code to generate the QR code

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();
 }
Copy after login

Now you can generate a QR code image after running it. Isn’t it very simple? Next, let’s see how to parse the QR code

2. Parsing the QR code

2.1 Add the Zxing-core.jar package to the classpath.

2.2 As with generation, we need an auxiliary class (BufferedImageLuminanceSource), which is also provided by Google. Here I will also post the source code of this class. You can copy and use it directly, saving you the trouble of searching.

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);
  }
  
 }
Copy after login

2.3 Write the implementation code for parsing the QR code

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();
     }
Copy after login

Now after running it, you can see that the console prints out the content of the QR code.

So far, the demonstration of using Zxing to generate and parse QR codes has been completed. It is mainly used as a memo for myself and for the convenience of those in need.

The above simple example of Java using Zxing to generate QR codes is all the content shared by the editor. I hope it can give you a reference, and I also hope that everyone will support the PHP Chinese website.

For more simple examples of Java using Zxing to generate QR codes, please pay attention to the PHP Chinese website!


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to restrict access to specific interfaces of nested H5 pages through OAuth2.0's scope mechanism? How to restrict access to specific interfaces of nested H5 pages through OAuth2.0's scope mechanism? Apr 19, 2025 pm 02:30 PM

How to use OAuth2.0's access_token to achieve control of interface access permissions? In the application of OAuth2.0, how to ensure that the...

In back-end development, how to distinguish the responsibilities of the service layer and the dao layer? In back-end development, how to distinguish the responsibilities of the service layer and the dao layer? Apr 19, 2025 pm 01:51 PM

Discussing the hierarchical architecture in back-end development. In back-end development, hierarchical architecture is a common design pattern, usually including controller, service and dao three layers...

In Java remote debugging, how to correctly obtain constant values ​​on remote servers? In Java remote debugging, how to correctly obtain constant values ​​on remote servers? Apr 19, 2025 pm 01:54 PM

Questions and Answers about constant acquisition in Java Remote Debugging When using Java for remote debugging, many developers may encounter some difficult phenomena. It...

How to choose Java project management tools when learning back-end development? How to choose Java project management tools when learning back-end development? Apr 19, 2025 pm 02:15 PM

Confused with choosing Java project management tools for beginners. For those who are just beginning to learn backend development, choosing the right project management tools is crucial...

Ultimate consistency in distributed systems: how to apply and how to compensate for data inconsistencies? Ultimate consistency in distributed systems: how to apply and how to compensate for data inconsistencies? Apr 19, 2025 pm 02:24 PM

Exploring the application of ultimate consistency in distributed systems Distributed transaction processing has always been a problem in distributed system architecture. To solve the problem...

How to convert names to numbers to implement sorting within groups? How to convert names to numbers to implement sorting within groups? Apr 19, 2025 pm 01:57 PM

How to convert names to numbers to implement sorting within groups? When sorting users in groups, it is often necessary to convert the user's name into numbers so that it can be different...

Why does the Python script not be found when submitting a PyFlink job on YARN? Why does the Python script not be found when submitting a PyFlink job on YARN? Apr 19, 2025 pm 02:06 PM

Analysis of the reason why Python script cannot be found when submitting a PyFlink job on YARN When you try to submit a PyFlink job through YARN, you may encounter...

How to dynamically modify the savePath parameter of @Excel annotation in easypoi when project starts in Java? How to dynamically modify the savePath parameter of @Excel annotation in easypoi when project starts in Java? Apr 19, 2025 pm 02:09 PM

How to dynamically configure the parameters of entity class annotations in Java During the development process, we often encounter the need to dynamically configure the annotation parameters according to different environments...

See all articles