DIY系列之——某校图书证条形码制作
DIY系列之——某校图书证条形码制作小谷同学 2011/9/25
摘要
关键词: 条形码
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
目录
1.某校图书证编码规则
2.条形码制作的过程
3.打印与测试
4.扩展应用
5.关于本例的一些思考
6.免责声明与使用注意事项
7.参考文献
8.附录
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文。
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
1.某校图书证编码规则
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
②图书证的白色条码都是一样的,分为以下三部分:
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
1)起始部分:00110;
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
表一 某校图书证号每个数字对应的代码
数字 代码 代码数字来源 数字 代码 代码数字来源
1 10001 1:0001 6 01100 6:0110
2 01001 2:0010 7 00011 8:1000
3 11000 3:0011 8 10010 9:1001
4 00101 4:0100 9 01010 10:1010
5 10100 5:0101 0 00110 12:1100
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
3)终止部分:00110,与起始部分以及数字0的代码都一致。
2.条形码的制作过程
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
条形码效果如图所示(程序代码见附件所示)。
图一 所得条形码效果图
3.打印与测试
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
为了方便进行测试,本文打印出不同大小的条形码。
测试一:将其用透明胶带粘在硬纸板上。
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
效果如图二所示。
图二 打印效果图
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
4.扩展应用
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
图三 可供彩色打印的图书证
过后,我们会给出相应的网页版、C++版、VB版等等。
5.关于本例的一些思考
由相关文献,可知条码技术具有以下优点:
1)、输入速度快;
2)、可靠性高;
3)、采集信息量大;
4)、灵活实用;
5)、条码标签易于制作
6)、识别设备操作容易,不需要特殊培训;
7)、设备也相对便宜。
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文)。
图四:常见的二维码
6.免责声明与注意事项
版权所有,翻版必究。
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
7.
参考文献
条形码—百度百科http://baike.baidu.com/view/13740.htm
二维码—百度百科http://baike.baidu.com/view/132241.htm
8.
附录
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
%barcode.m
%生成学号a对应的条形码
%2011/09/25 13:24 BY小谷同学
a='1234567890123';%学号,自行更改
Black_num=[1,0,0,0,1;0,1,0,0,1;1,1,0,0,0;0,0,1,0,1;1,0,1,0,0;
0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
White_num=;%插入符的编码
%Black_SE='00110';
%White_SE='10001';White_M='01001';
barheight=30;%定义条形码的高度
barwidth=1;%定义条形码的像素宽度
%可以对特定长度的输入进行控制,本文规定长度为13
if length(a)~=13
error('图书证必须有13个数字');
end
barcode_SE=;
%为方便,直接人工得出起始与终止部分的条形码
%也可以由程序生成.
total=length(a)*(7+7);
%条形码的总像素宽
%也可以不用求,因MATLAB提供的均是动态数组
s=1;%计数,记录
%由于利用for语句容易出现不可预料的错误
%大部分是数组的行标与列标的调用问题,于是采用while循环
%嵌套循环,得出数据部分
m=1;
while m<14
if a(m)=='0';
t=10;
%若为数字零,应该调用的下标是10
else
t=double(a(m)-48);
%由于输入是ascii字符,转换为整数需要减去30H,即48
end
n=1;%同样的while循环
while n<6
if Black_num(t,n)==0
barcode_M(s)=0;
s=s+1;
else
barcode_M()=;
s=s+2;
end
if White_num(n)==0
barcode_M(s)=1;
s=s+1;
else
barcode_M()=;
s=s+2;
end
n=n+1;
end
m=m+1;
end
bcode=ones(barheight,1)*;
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
imshow(bcode)%显示所得到得条形码
%然后可以自行存贮得到的条形码
%然后用PS等工具得出具有自己特色图书证啦
够强大!!! 强啊{:soso_e179:} 很强大啊,
可惜首先我联想到的是可以用来制作假的书本条形码,用于还不见了的书,,我这是在犯罪吧?{:3_60:} freedomfox 发表于 2011-9-29 20:36 static/image/common/back.gif
很强大啊,
可惜首先我联想到的是可以用来制作假的书本条形码,用于还不见了的书,,我这是在犯罪吧?{:3_ ...
可以,不过你的学校肯定有记录,一旦发现,后果很严重的;
目前我想到是:
一、去周围学校的图书馆。
二、自己丢的图书证自己做一个一模一样的来。
三、将图片弄到手机上,然后用手机刷进图书馆,吸引眼球{:3_52:}
四、将来毕业再回学校,再做一个图书证进图书馆
呵呵呵
。。
页:
[1]