-
条形码是一个很常见的东西,可以是商品价格,货物的编码等一切都有关,而他也可称为一维码。条形码的格式有很多,如:Code 39, Code 93, Code 128, Codabar, Interleaved 2 of 5, EAN-8, EAN-13, UPC-A, UPC-E等等。
-
在ssm上面实现绘画赋予数值的条形码,以0.33间隔的条形码实现格式为Code 128。而现在两种模式的条形码jar包,第一个是普通条形码包/barcode4j,第二个是可以在条形码下面的数字实现文字出现的包/google。
-
那么先看第二个可实现文字出现的条形码,而这里导入依赖包位置是使用maven创建的pom.xml里面,然后导入它需要用到的两个jar包,如下图:
- 最后创建一个类绘画我所需要的条形码,流程为:首先用它生成条形码的图片,然后生成一个新的图片面板,再将条形码图片放到新的图片面板上,最后将文字放到图片面板上(条形码下方)。如下图:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
//1、首先用google zxing 生成条形码的图片
//2、生成一个新的图片面板
//3、将条形码图片放到新的图片面板上
//4、将文字放到图片面板上(条形码下方)
public class GoogleBarCodeUtils {
/** 条形码宽度 */
private static final int WIDTH = 300;
/** 条形码高度 */
private static final int HEIGHT = 50;
/** 加文字 条形码 */
private static final int WORDHEIGHT = 75;
/**
* 1.设置 条形码参数
*/
private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
private static final long serialVersionUID = 1L;
{
// 设置编码方式
put(EncodeHintType.CHARACTER_SET, "utf-8");
}
};
/**
* 2.生成 图片缓冲
* @author fxbin
* @param vaNumber VA 码
* @return 返回BufferedImage
*/
public static BufferedImage getBarCode(String vaNumber){
try {
Code128Writer writer = new Code128Writer();
// 编码内容, 编码类型, 宽度, 高度, 设置参数
BitMatrix bitMatrix = writer.encode(vaNumber,
BarcodeFormat.CODE_128,
WIDTH,
HEIGHT,
hints);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
/**
* 3.把带logo的二维码下面加上文字
* @author fxbin
* @param image 条形码图片
* @param words 文字
* @return 返回BufferedImage
*/
public static BufferedImage insertWords(BufferedImage image, String words){
// 新的图片,把带logo的二维码下面加上文字
BufferedImage outImage = new BufferedImage(WIDTH, WORDHEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = outImage.createGraphics();
// 抗锯齿
setGraphics2D(g2d);
// 设置白色
setColorWhite(g2d);
// 画条形码到新的面板
g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
// 画文字到新的面板
Color color=new Color(0, 0, 0);
g2d.setColor(color);
// 字体、字型、字号
g2d.setFont(new Font("微软雅黑", Font.PLAIN, 18));
//文字长度
int strWidth = g2d.getFontMetrics().stringWidth(words);
//总长度减去文字长度的一半 (居中显示)
int wordStartX=(WIDTH - strWidth) / 2;
//height + (outImage.getHeight() - height) / 2 + 12
int wordStartY=HEIGHT+20;
// 画文字
g2d.drawString(words, wordStartX, wordStartY);
g2d.dispose();
outImage.flush();
return outImage;
}
/**
* 4.设置 Graphics2D 属性 (抗锯齿)
* @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
*/
private static void setGraphics2D(Graphics2D g2d){
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
g2d.setStroke(s);
}
/**
* 5.设置背景为白色
* @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
*/
private static void setColorWhite(Graphics2D g2d){
g2d.setColor(Color.WHITE);
//填充整个屏幕
g2d.fillRect(0,0,600,600);
//设置笔刷
g2d.setColor(Color.BLACK);
}
public static void main(String[] args) throws IOException {
BufferedImage image = insertWords(getBarCode("SY-SY24700/7"), "盛元-SY24700/7");
ImageIO.write(image, "jpg", new File("F:/TXM/barcode.png"));
}
}
-
最后运行结果如下图:
6 -
虽然过程有些麻烦,但大多是为了处理文字所出现的代码量。如果觉得麻烦的同时又不需要用到文字的出现,只需要英文数字就OK的话,可以用第一种,而且他的代码量可以说只有二三十行,极容易理解,和方便调试或更给数值参数,而他需要导入一个jar,如下图:
- 而b4j的流程很简单,首先得到要设置条形码的数据,和存放路径,然后设置好条形码的条形精细度,配置对象,最后就可以直接输出条形码了。代码如下图:
import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
import org.springframework.util.StringUtils;
import java.awt.image.BufferedImage;
import java.io.*;
public class StrippedDownBarcode {
public static void generate(String msg, OutputStream ous){
//1.判断msg是否有数据
if (StringUtils.isEmpty(msg) || ous == null) {
return;
}
//2.设置条形精细度(越大越细),条形宽度(越大越长),类型
final int dpi=200;
final double moduleWidth= UnitConv.in2mm(1.0f/dpi);
String format = "image/png";
//3.配置对象(宽度,条形间隔,两边是否留)
Code39Bean bean=new Code39Bean();
bean.setModuleWidth(moduleWidth);
bean.setWideFactor(3);
bean.doQuietZone(false);
//4.绘画(输出流;生成;结束)
try{
BitmapCanvasProvider canvas=new BitmapCanvasProvider(ous,format,dpi,
BufferedImage.TYPE_BYTE_BINARY,false,0);
bean.generateBarcode(canvas,msg);
canvas.finish();
}catch (IOException e){
throw new RuntimeException(e);
}
}
public static File generateFile(String msg,String path){
File file = new File(path);
try{
generate(msg,new FileOutputStream(file));
}catch (FileNotFoundException e){
throw new RuntimeException(e);
}
return file;
}
public static void main(String[] a){
String msg="S Y 2 4 7 0 0";
String path="F:/TXM/mm.png";
generateFile(msg,path);
}
}
- 最后得到的条形码图片如下图: