Teach you step by step using Java design to generate QR codes
In the era of the Internet of Things, QR codes are a very important thing. Now, no matter what you are, you have to get a QR code logo. For fear of being out of date, you can't use QR code to identify it. Maybe one day the birth certificate or household registration book will be identified with a QR code. Today I was on a whim and saw that others had added QR codes to their blogs, and I also wanted to do a test.
It is mainly used to achieve two points:
1. Generate a QR code with any text.
2. Add an image in the middle of the QR code.
1. Preparation work.
Prepare the QR QR code 3.0 core package and a jpg picture.
Download the QR QR code package.
First, I have to download the zxing.jar package. I am using the core package of 3.0 here
Download address: Now it has been moved to github: https://github.com/zxing/zxing/wiki/Getting-Started-Developing,
Of course, you can also download the jar package from the maven repository: http://central.maven.org/maven2/com/google/zxing/core/
2. Programming
1. Start eclipse, create a new java project, and find the project name (in this example, name it QRCodeSoft). Click Next:
2. Import the zxing.jar package. I am using the core package of 3.0 here: click "Add external JAR(X)...".
3. Create two new classes, namely:
BufferedImageLuminanceSource.java
QRCodeUtil.java
The key codes are: BufferedImageLuminanceSource.java and QRCodeUtil.java , where the main method tested is located in QRCodeUtil.java.
BufferedImageLuminanceSource.java program code:
package com.yihaomen.barcode;import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import com.google.zxing.LuminanceSource;public 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, 0xFFFFFF); // = 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;}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;}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;}public boolean isCropSupported() {return true;}public LuminanceSource crop(int left, int top, int width, int height) {return new BufferedImageLuminanceSource(image, this.left + left,this.top + top, width, height);}public boolean isRotateSupported() {return true;}public LuminanceSource rotateCounterClockwise() {int sourceWidth = image.getWidth();int sourceHeight = image.getHeight();AffineTransform transform = new AffineTransform(0.0, -1.0, 1.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);}}QRCodeUtil.java program code:
package com.yihaomen.barcode;import java.awt.BasicStroke;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Shape;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.OutputStream;import java.util.Hashtable;import java.util.Random;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;import com.google.zxing.BinaryBitmap;import com.google.zxing.DecodeHintType;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatReader;import com.google.zxing.MultiFormatWriter;import com.google.zxing.Result;import com.google.zxing.common.BitMatrix;import com.google.zxing.common.HybridBinarizer;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;/** * QR code tool class* */public class QRCodeUtil {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// QR code size private static final int QRCODE_SIZE = 300;// LOGO width private static final int WIDTH = 60;// LOGO height private static final int HEIGHT = 60;private static BufferedImage createImage(String content, String imgPath,boolean needCompress) throws Exception {Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);int width = bitMatrix.getWidth();int height = bitMatrix.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, bitMatrix.get(x, y) ? 0xFF000000: 0xFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// Insert image QRCodeUtil.insertImage(image, imgPath, needCompress);return image;}/** * Insert LOGO * * @param source * QR code picture * @param imgPath * LOGO picture address * @param needCompress * Whether to compress * @throws Exception */private static void insertImage(BufferedImage source, String imgPath,boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println(""+imgPath+" This file does not exist! ");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // Compress LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height,Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // Draw the reduced graph g.dispose();src = image;}// Insert LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}/** * Generate QR code (embedded LOGO) * * @param content * Content* @param imgPath * LOGO address* @param destPath * Store directory* @param needCompress * Whether to compress LOGO * @throws Exception */public static void encode(String content, String imgPath, String destPath,boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath,needCompress);mkdirs(destPath);String file = new Random().nextInt(999999999)+".jpg";ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));}/** * When the folder does not exist, mkdir will automatically create multi-layer directories, which is different from mkdir. (If the parent directory does not exist, an exception will be thrown) * @author lanyuan * Email: [email protected] * @date 2013-12-11 10:16:36 am * @param destPath Store directory*/public static void mkdirs(String destPath) {File file =new File(destPath); //When the folder does not exist, mkdirs will automatically create multi-layer directories, which is different from mkdir. (mkdir will throw an exception if the parent directory does not exist)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}/** * Generate QR code (embedded LOGO) * * @param content * Content* @param imgPath * LOGO address* @param destPath * Storage address* @throws Exception */public static void encode(String content, String imgPath, String destPath)throws Exception {QRCodeUtil.encode(content, imgPath, destPath, false);}/** * Generate QR code* * @param content * Content* @param destPath * Storage address* @param needCompress * Whether to compress LOGO * @throws Exception */public static void encode(String content, String destPath,boolean needCompress) throws Exception {QRCodeUtil.encode(content, null, destPath, needCompress);}/** * Generate QR code* * @param content * Content* @param destPath * Storage address* @throws Exception */public static void encode(String content, String destPath) throws Exception {QRCodeUtil.encode(content, null, destPath, false);}/** * Generate QR code (embedded LOGO) * * @param content * Content* @param imgPath * LOGO address* @param output * Output stream* @param needCompress * Whether to compress LOGO * @throws Exception */public static void encode(String content, String imgPath,OutputStream output, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);ImageIO.write(image, FORMAT_NAME, output);}/** * Generate QR code* * @param content * Content* @param output * Output stream* @throws Exception */public static void encode(String content, OutputStream output)throws Exception {QRCodeUtil.encode(content, null, output, false);}/** * Analyze QR code* * @param file * QR code image* @return * @throws Exception */public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}/** * Parsing QR code* * @param path * QR code image address* @return * @throws Exception */public static String decode(String path) throws Exception {return QRCodeUtil.decode(new File(path));}public static void main(String[] args) throws Exception {String text = "http://www.yihaomen.com";QRCodeUtil.encode(text, "c:/me.jpg", "c:/barcode", true);}}Generate QR code without logo
The program code is as follows:
public static void main(String[] args) throws Exception { String text = "http://www.dans88.com.cn"; QRCodeUtil.encode(text,"","d:/MyWorkDoc",true);}Run this test method and the generated QR code does not have a logo, the style is as follows:
If you are interested, you can scan it with your phone
Generate a QR code with a logo
Logo You can use your own avatar or an image you like, and use the following code, the program code is as follows:
public static void main(String[] args) throws Exception { String text = "http://www.dans88.com.cn"; QRCodeUtil.encode(text, "d:/MyWorkDoc/my180.jpg", "d:/MyWorkDoc", true); }The only difference is that the address of the logo is specified on the previous basis, and the image files of the C disk are used here.
Scan with your mobile phone, and the text you want to appear can appear. Click to enter your own website.
The above is to use JAVA design to generate QR codes. Interested friends can refer to it. Thank you for your support for this site!