本文用到的三个 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();
}
}
用到的 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");
}
}
用到的 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");
}
}