项目背景:由于条形码code不固定,生成的条形码密度,宽度不一致,有些条码密度太紧凑,导致扫码,扫不出来。

解决方法:重写zxing源码方法,看源码可以找到leftPadding决定了边距。

/*** @return a byte array of horizontal pixels (0 = white, 1 = black)*/private static BitMatrix renderResult(boolean[] code, int width, int height, int sidesMargin) {int inputWidth = code.length;// Add quiet zone on both sides.int fullWidth = inputWidth + sidesMargin;int outputWidth = Math.max(width, fullWidth);int outputHeight = Math.max(1, height);int multiple = outputWidth / fullWidth;int leftPadding = (outputWidth - (inputWidth * multiple)) / 2;BitMatrix output = new BitMatrix(outputWidth, outputHeight);for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) {if (code[inputX]) {output.setRegion(outputX, 0, multiple, outputHeight);}}return output;}

这里只改了Code 128,

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.Writer;
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.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;/*** @author wby* @date 2020/11/2*/
public class CodeBar128Util implements Writer {private static String format = "png";//生成条形码图片类型public static void main(String[] args) throws Exception {getCodeBar("AMB02-0001-OCKSDJ-02", 335, 40);}/*** 生成条码方法** @param content* @param width* @param height* @return* @throws Exception*/public static void getCodeBar(String content, int width, int height) throws Exception {HashMap<EncodeHintType, Comparable> hints = new HashMap<EncodeHintType, Comparable>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.MARGIN, 3);BitMatrix encode = new CodeBar128Util().encode(content, BarcodeFormat.CODE_128, width, height, hints);BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(encode);ImageIO.write(bufferedImage, "bmp", new FileOutputStream(new File("d://testBarcode_1.bmp")));}public static byte[] getCodeBar(String content) {HashMap<EncodeHintType, Comparable> hints = new HashMap<EncodeHintType, Comparable>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.MARGIN, 3);ByteArrayOutputStream ot = new ByteArrayOutputStream();try {//设置宽高比例,自己调,这里主要是固定了宽度,高度不一致int width = new Code128Writer().encode(content).length;int height = width / 2;BitMatrix bm = new CodeBar128Util().encode(content, BarcodeFormat.CODE_128, width, height, hints);MatrixToImageWriter.writeToStream(bm, format, ot);} catch (Exception e) {e.printStackTrace();}return ot.toByteArray();}@Overridepublic final BitMatrix encode(String contents, BarcodeFormat format, int width, int height)throws WriterException {return encode(contents, format, width, height, null);}/*** Encode the contents following specified format.* {@code width} and {@code height} are required size. This method may return bigger size* {@code BitMatrix} when specified size is too small. The user can set both {@code width} and* {@code height} to zero to get minimum size barcode. If negative value is set to {@code width}* or {@code height}, {@code IllegalArgumentException} is thrown.*/@Overridepublic BitMatrix encode(String contents,BarcodeFormat format,int width,int height,Map<EncodeHintType, ?> hints) throws WriterException {if (contents.isEmpty()) {throw new IllegalArgumentException("Found empty contents");}if (width < 0 || height < 0) {throw new IllegalArgumentException("Negative size is not allowed. Input: "+ width + 'x' + height);}int sidesMargin = 2;if (hints != null && hints.containsKey(EncodeHintType.MARGIN)) {sidesMargin = Integer.parseInt(hints.get(EncodeHintType.MARGIN).toString());}boolean[] code = new Code128Writer().encode(contents);return renderResult(code, width, height, sidesMargin);}/*** @return a byte array of horizontal pixels (0 = white, 1 = black)*/private static BitMatrix renderResult(boolean[] code, int width, int height, int sidesMargin) {int inputWidth = code.length;int fullWidth = inputWidth;int outputWidth;if (width % inputWidth == 0) {outputWidth = width;}outputWidth = width > inputWidth ? width / inputWidth * inputWidth : (width / inputWidth + 1) * inputWidth;int outputHeight = Math.max(1, height);int multiple = outputWidth / fullWidth;int leftPadding = sidesMargin;BitMatrix output = new BitMatrix(outputWidth + 2 * sidesMargin, outputHeight);for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) {if (code[inputX]) {output.setRegion(outputX, 0, multiple, outputHeight);}}return output;}
}

java zxing条形码去掉两边空白,密度调整,固定条形码宽度相关推荐

  1. Zxing 生成二维码和条形码去掉白边

    源码下载: https://github.com/AndroidZmm123/ZxingApplication 需求:根据输入内容,生成条形码或者二维码. 我们大多数会选择Zxing.因为jar包较小 ...

  2. python去掉两边空格_Python模拟删除字符串两边的空白

    目标: 1.使用string模块的whitespace 2.删除左边.右边以及两边的空白 代码如下: [root@localhost python]# cat rmspace.py #!/usr/bi ...

  3. 基于zxing生成与解析二维码、条形码

    基于zxing(https://github.com/zxing/zxing)与maven,针对二维码(包括带图片的二维码).条形码进行了简单的封装,以便在项目中更好的利用. ZXing是一个开源Ja ...

  4. Java zxing生成vcard二维码名片

    一)背景 最近想做个vcard个人名片的二维码,从网上查了相关在线生成二维码功能,也能实现功能.但自己因为想用java的方式来实现,网上最多的案例都是依赖zxing jar实现,但由于要生成统一的vc ...

  5. zxing白边java_ZXing生成无白边条形码

    参考连接中的代码作了简化,StrToBrCode.class直接用 package de.safetytaxfree.tuishuibaoshangmiprinter.Printer; import ...

  6. html 网页两边空白,windows7系统打开网页两边空白怎么办

    在windows7系统中,很多用户都喜欢使用自带的ie浏览器来浏览网页,然而有时候在打开网页的时候,发现两边出现空白,该如何解决呢,本教程就给大家介绍一下windows7系统打开网页两边空白的详细操作 ...

  7. Python Matplotlib 柱状图 改变柱子两边空白区域宽度

    加入这两行代码(相当于改变x坐标从几到几),N表示有几个柱子 x_num = np.arange(N) plt.xlim(min(x_num)-0.5,max(x_num)+0.5) 前后对比图: 之 ...

  8. java 网页空白_win8系统运行Java程序网页会出现空白的解决方法

    我们在操作win8系统电脑的时候,常常会遇到win8系统运行Java程序网页会出现空白的问题.那么出现win8系统运行Java程序网页会出现空白的问题该怎么解决呢?很多对电脑不太熟悉的小伙伴不知道wi ...

  9. java对象序列化去掉字段_使用序列化查找对象中的脏字段

    java对象序列化去掉字段 假设您正在开发一个将对象自动保存到数据库中的框架. 您需要检测两次保存之间所做的更改,以便仅保存已修改的字段. 如何检测脏场. 最简单的方法是遍历原始数据和当前数据,并分别 ...

最新文章

  1. matlab安装教程补充
  2. idea在Mybatis的xml里面写sql时,表名、字段、报红问题的解决方法
  3. 【HDOJ】1239 Calling Extraterrestrial Intelligence Again
  4. 系统快捷键被谁占用? 查看工具
  5. 量子遗传算法原理与MATLAB仿真程序
  6. (二)html5中的属性
  7. win2008R2管理员密码修改文档
  8. 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍
  9. 一年前端开发工程师简历_一年前,我开始学习编码,专注于前端开发。
  10. c#+web与php,将Web服务客户端从c#转换为php
  11. 课程设计第一次实验总结
  12. qt android 网络编程实例,【9】QT网络编程
  13. java炫酷龙卷风源码,龙卷风's Blog
  14. 小学听课计算机笔记范文,小学听课笔记 范文大全
  15. 最新服务器主流硬盘,主流服务器的raid(磁盘阵列)配置
  16. java加密方案:Virbox Protector Java版-全新保护方案
  17. 量化投资 | 统计套利策略
  18. 相似图像识别算法是什么,机器图像识别常用算法
  19. centos 7.5 安装桌面环境及报错
  20. CSS实现强制换行的解决方法

热门文章

  1. 凝思系统服务器系统版本,凝思操作系统Custom Linx安装教程
  2. 安卓编程用什么软件_如何用手机进行编程?有哪些值得推荐的软件?
  3. CC2541之串口(转)
  4. C++ 的未来——第 2 部分
  5. 安卓开发VideoView播放本地视频失败解决办法
  6. rtx a1000相当于什么显卡 rtxa1000相当于gtx多
  7. CSS - 制作三角形
  8. 从零开始创建自己的区块链应用(JAVA版)
  9. 初入Linux——软件安装
  10. 九龙证券|美国散户疯狂抄底,嗅到了什么?华尔街最新警告