Java 生成二维码 / 条形码

Java 生成二维码 / 条形码

  • 生成二维码
  • 生成条形码
    • barcode4j 生成条形码
    • JBarcode 生成条形码

本文用到的三个 jar 包,百度云自取 戳我

生成二维码

用到的 jar 包:core-3.3.3.jar
注意:内容最多为 17 位,可以为数字、字母和各种特殊符号,不支持汉字。不超过最大长度时能生成二维码,但是扫的结果中汉字显示为?号。字母区分大小写
代码示例:

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class BarcodeCreateTest {
	public static void main(String[] args) throws Exception {
		createSquareCode("2_1xiao和-T%[email protected]", new FileOutputStream(new File("E:\\xiao\\squarecode.png")));
		System.out.println("succeed");
	}

	/**
	 *   生成二维码
	 * @param content 二维码内容
	 * @param output 输出流/位置
	 * @throws Exception
	 */
	public static void createSquareCode(String content, OutputStream output) throws Exception {
		Map hints = new HashMap();
		hints.put(EncodeHintType.MARGIN, 0);
		BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, 150, 150, hints);
		// 去白边
		int[] rec = bitMatrix.getEnclosingRectangle();
		int resWidth = rec[2] + 1;
		int resHeight = rec[3] + 1;
		BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
		resMatrix.clear();
		for (int i = 0; i < resWidth; i++) {
			for (int j = 0; j < resHeight; j++) {
				if (bitMatrix.get(i + rec[0], j + rec[1])) {
					resMatrix.set(i, j);
				}
			}
		}
		// 生成二维码
		int width = resMatrix.getWidth();
		int height = resMatrix.getHeight();
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
		for (int x = 0; x < width; x++) {
			for (int y = 0; y < height; y++) {
				image.setRGB(x, y, resMatrix.get(x, y) == true ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
			}
		}
		ImageIO.write(image, "png", output);
		
		output.close();
	}
}

生成条形码

barcode4j 生成条形码

用到的 jar 包:barcode4j-light.jar
注意:支持数字字母,我随便试了些特殊符号,支持 % - ,不支持@#$()和汉字等,如果输入了不支持的符号执行报错。生成的条形码的图中虽然显示小写字母,但扫描结果都是显示大写字母。
内容长度似乎无限限制,但太长,就很难扫出结果了。

代码示例:

package barcodeCreate;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;

public class BarcodeCreateTest {

	// 生成文件
	public static File generateFile(String content, String path) {
		File file = new File(path);
		try {
			generate(content, new FileOutputStream(file));
		} catch (FileNotFoundException e) {
			throw new RuntimeException(e);
		}
		return file;
	}

	// 生成字节
	public static byte[] generate(String content) {
		ByteArrayOutputStream ous = new ByteArrayOutputStream();
		generate(content, ous);
		return ous.toByteArray();
	}

	// 生成到流
	public static void generate(String content, OutputStream ous) {

		Code39Bean bean = new Code39Bean();
		// 精细度
		final int dpi = 150;
		// module宽度
		final double moduleWidth = UnitConv.in2mm(1.0f / dpi);

		// 配置对象
		bean.setModuleWidth(moduleWidth);
		bean.setWideFactor(3);
		bean.doQuietZone(false);

		String format = "image/png";
		try {
			BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi, 
					BufferedImage.TYPE_BYTE_BINARY, false, 0);
			// 生成条形码
			bean.generateBarcode(canvas, content);
			canvas.finish();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public static void main(String[] args) {
		String content = "12345xia%ofand154985iujiftrkljoinkl$o6789-v1.0";
		String path = "E:\\xiao\\test.png";
		generateFile(content, path);
		System.out.println("succeed");
	}
}

JBarcode 生成条形码

用到的 jar 包:jbarcode-0.2.8.jar
注意:本文用的是 code128 编码,区分大小写,支持字母数字和各种特殊符号,不支持汉字,有不支持的符号是执行报错。内容太多能生成条形码,内容合法的话,但是太长就不好扫描结果了,至少我的手机没扫出来。

代码示例:

package barcodeCreate;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import org.jbarcode.JBarcode;
import org.jbarcode.encode.Code128Encoder;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.EAN13TextPainter;
import org.jbarcode.paint.WidthCodedPainter;

public class BarcodeCreateTest {
	/**
	 * 128条形码
	 * 
	 * @param strBarCode  条形码
	 * @param dimension  商品条形码:尺寸
	 * @param barheight  商品条形码:高度
	 * @return 图片(Base64编码)
	 */
	public static void generateBarCode128(String strBarCode, String dimension, String barheight, OutputStream ous) {

		try {
			BufferedImage bi;
			// int len = strBarCode.length();
			JBarcode productBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(),
					EAN13TextPainter.getInstance());

			// 尺寸,面积,大小 密集程度
			productBarcode.setXDimension(Double.valueOf(dimension).doubleValue());
			// 高度 10.0 = 1cm 默认1.5cm
			productBarcode.setBarHeight(Double.valueOf(barheight).doubleValue());
			// 宽度
			productBarcode.setWideRatio(Double.valueOf(30).doubleValue());
			// 是否显示字体
			productBarcode.setShowText(true);
			// 显示字体样式
			productBarcode.setTextPainter(BaseLineTextPainter.getInstance());
			// 生成条形码
			bi = productBarcode.createBarcode(strBarCode);

			ImageIO.write(bi, "jpg", ous);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}


	public static void main(String[] args) throws IOException {
		FileOutputStream opath = new FileOutputStream(new File("E:\\xiao\\barcode.jpg"));
		generateBarCode128("Ar-$%*()_r53 78@#3", "0.5", "30", opath);
		System.out.println("succeed");
	}
}

你可能感兴趣的:(Java)