All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.somta.common.utils.io.QRCodeUtil Maven / Gradle / Ivy

There is a newer version: 1.4.3
Show newest version
package net.somta.common.utils.io;

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.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import net.somta.common.utils.encrypt.Base64;

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.Float;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Hashtable;
import javax.imageio.ImageIO;

public class QRCodeUtil {
	private static final String CHARSET = "utf-8";
	private static final String FORMAT_NAME = "PNG";
	public static final String PIC_PNG = "data:image/png;base64,";
	private static final int QRCODE_SIZE = 200;
	private static final int WIDTH = 60;
	private static final int HEIGHT = 60;

	public QRCodeUtil() {
	}

	private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
		return createImage(content, imgPath, needCompress, 200);
	}

	public static BufferedImage createImage(String content, String imgPath, boolean needCompress, int qrcodeSize) throws Exception {
		Hashtable hints = new Hashtable();
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
		hints.put(EncodeHintType.MARGIN, Integer.valueOf(1));
		BitMatrix bitMatrix = (new MultiFormatWriter()).encode(content, BarcodeFormat.QR_CODE, qrcodeSize, qrcodeSize, hints);
		int width = bitMatrix.getWidth();
		int height = bitMatrix.getHeight();
		BufferedImage image = new BufferedImage(width, height, 1);

		for(int x = 0; x < width; ++x) {
			for(int y = 0; y < height; ++y) {
				image.setRGB(x, y, bitMatrix.get(x, y)?-16777216:-1);
			}
		}

		if(imgPath != null && !"".equals(imgPath)) {
			insertImage(image, imgPath, needCompress, qrcodeSize);
			return image;
		} else {
			return image;
		}
	}

	/**
	 * 将base64图片转换成BufferedImage
	 * @param content 二维码内容
	 * @param needCompress 是否需要压缩
	 * @param qrcodeSize 二维码大小
	 * @return BufferedImage
	 * @throws Exception 异常
	 */
	public static BufferedImage createImages(String content, boolean needCompress, int qrcodeSize) throws Exception {
		Hashtable hints = new Hashtable();
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
		hints.put(EncodeHintType.MARGIN, Integer.valueOf(1));
		BitMatrix bitMatrix = (new MultiFormatWriter()).encode(content, BarcodeFormat.QR_CODE, qrcodeSize, qrcodeSize, hints);
		int width = bitMatrix.getWidth();
		int height = bitMatrix.getHeight();
		BufferedImage image = new BufferedImage(width, height, 1);

		for(int x = 0; x < width; ++x) {
			for(int y = 0; y < height; ++y) {
				image.setRGB(x, y, bitMatrix.get(x, y)?-16777216:-1);
			}
		}

		return image;
	}

	public static InputStream converStream(BufferedImage image, String Type) throws IOException {
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		ImageIO.write(image, Type, os);
		return new ByteArrayInputStream(os.toByteArray());
	}

	public static void insertImage(BufferedImage source, String imgPath, boolean needCompress, int qrcodeSize) throws Exception {
		File file = new File(imgPath);
		if(file.exists()) {
			Image src = ImageIO.read(new File(imgPath));
			int width = ((Image)src).getWidth((ImageObserver)null);
			int height = ((Image)src).getHeight((ImageObserver)null);
			if(needCompress) {
				if(width > qrcodeSize / 200 * 60) {
					width = qrcodeSize / 200 * 60;
				}

				if(height > qrcodeSize / 200 * 60) {
					height = qrcodeSize / 200 * 60;
				}

				Image image = ((Image)src).getScaledInstance(width, height, 4);
				BufferedImage tag = new BufferedImage(width, height, 1);
				Graphics g = tag.getGraphics();
				g.drawImage(image, 0, 0, (ImageObserver)null);
				g.dispose();
				src = image;
			}

			Graphics2D graph = source.createGraphics();
			int x = (qrcodeSize - width) / 2;
			int y = (qrcodeSize - height) / 2;
			graph.drawImage((Image)src, x, y, width, height, (ImageObserver)null);
			Shape shape = new Float((float)x, (float)y, (float)width, (float)width, 6.0F, 6.0F);
			graph.setStroke(new BasicStroke(3.0F));
			graph.draw(shape);
			graph.dispose();
		}
	}

	public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
		BufferedImage image = createImage(content, imgPath, needCompress);
		FileUtil.makeDir(destPath, false);
		ImageIO.write(image, "PNG", new File(destPath));
	}

	public static void encode(String content, String imgPath, String destPath, boolean needCompress, int qrcodeSize) throws Exception {
		BufferedImage image = createImage(content, imgPath, needCompress, qrcodeSize);
		FileUtil.makeDir(destPath, false);
		ImageIO.write(image, "PNG", new File(destPath));
	}

	public static void encode(String content, String imgPath, String destPath) throws Exception {
		encode(content, imgPath, destPath, false);
	}

	public static void encode(String content, String imgPath, String destPath, int qrcodeSize) throws Exception {
		encode(content, imgPath, destPath, false);
	}

	public static void encode(String content, String destPath, boolean needCompress) throws Exception {
		encode(content, (String)null, (String)destPath, needCompress);
	}

	public static void encode(String content, String destPath) throws Exception {
		encode(content, (String)null, (String)destPath, false);
	}

	public static void encode(String content, String imgPath, OutputStream output, boolean needCompress) throws Exception {
		BufferedImage image = createImage(content, imgPath, needCompress);
		ImageIO.write(image, "PNG", output);
	}

	public static void encode(String content, String imgPath, OutputStream output, boolean needCompress, int qrcodeSize) throws Exception {
		BufferedImage image = createImage(content, imgPath, needCompress, qrcodeSize);
		ImageIO.write(image, "PNG", output);
	}

	/**
	 * 根据内容直接生成图片的BASE64的字符串
	 * @param content
	 * @param needCompress
	 * @param qrcodeSize
	 * @return String
	 */
	public static String encode(String content, boolean needCompress, int qrcodeSize) {
		BufferedImage image = null;
		try {
			image = createImages(content, needCompress, qrcodeSize);
		} catch (Exception var11) {
			var11.printStackTrace();
		}

		byte[] btSt = ImageUtil.getBytes(image);
		byte[] byteStream = Base64.encodeByte(btSt).getBytes();
		StringBuilder sb = new StringBuilder("data:image/png;base64,");
		byte[] var10 = byteStream;
		int var9 = byteStream.length;

		for(int var8 = 0; var8 < var9; ++var8) {
			byte b = var10[var8];
			sb.append((char)b);
		}
		return sb.toString();
	}

	public static void encode(String content, OutputStream output, int qrcodeSize) throws Exception {
		encode(content, (String)null, (OutputStream)output, false, qrcodeSize);
	}

	public static void encode(String content, OutputStream output) throws Exception {
		encode(content, (String)null, (OutputStream)output, false);
	}

	public static String decode(File file) throws Exception {
		BufferedImage image = ImageIO.read(file);
		if(image == null) {
			return null;
		} else {
			BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
			BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
			Hashtable hints = new Hashtable();
			hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
			Result result = (new MultiFormatReader()).decode(bitmap, hints);
			String resultStr = result.getText();
			return resultStr;
		}
	}

	public static String decode(BufferedImage image) throws Exception {
		BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		Hashtable hints = new Hashtable();
		hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
		Result result = (new MultiFormatReader()).decode(bitmap, hints);
		String resultStr = result.getText();
		return resultStr;
	}

	public static String decode(String path) throws Exception {
		return decode(new File(path));
	}


	/*public static void main(String[] args) {
		String code = encode("1234",false,200);
		System.out.println(code);
	}*/

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy