DIY系列之——某校图书证条形码制作( P. N3 y& u, {% ~0 s% a; N& t
9 J* {2 h+ U$ s d7 f- S
小谷同学 2011/9/25" S/ L; c, o D+ e$ l
, b( V" i* U. d. l2 h摘要/ _! U. \" t2 L7 \- ?
8 Z" ?, K5 v. X. j% I
关键词: 条形码 4 J/ s( q( }, _- J% o0 \ ( ~; v3 U0 q/ r3 q+ C R; i8 c由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。 8 k k' W, |; F3 P: L I( i0 U- J0 l( @1 M. T2 P
目录& i# c* j. A5 e' K6 n
& e: Q* ^2 u ^说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。9 Z; e9 F& T0 Q# K
) h" s6 k+ z. i
3)终止部分:00110,与起始部分以及数字0的代码都一致。3 O' M, ]3 s& C1 }8 u
# L& f% [! \" m, F j' l7 M2.条形码的制作过程 : a' U3 m$ Y& O, ^0 b. n2 d1 V& U- R8 G
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。 * w/ f; X/ ~2 u. C0 t& ?: [ , M: I( N* }/ \, g! b定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。 V, r; R8 G6 I( B* _, t0 g* E/ ~0 R3 K
: u" T- Y' Z \! a: K0 y0 r条形码效果如图所示(程序代码见附件所示)。+ d$ Q0 ?5 L F' d- C6 [! U0 C
0 i: g$ R; _& w1 o图四:常见的二维码2 `$ \! |5 w! d
3 c, U9 u$ Z- j0 J3 g3 b
6.免责声明与注意事项 / b8 `* w+ g2 ^. z/ t, T % K N) |0 @- e* l( L5 E版权所有,翻版必究。 # Z# J+ y! T2 L. B5 Z2 I, d9 ^4 |% \2 F7 H$ [
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。 1 C. G: ]5 [: w/ q9 g% n U8 j& ] ~; Y# D( I4 J
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 ) C5 F% T/ ?( R) a, ^3 D/ H' n1 c
8 y( }' M! B% L0 \; E7. , _3 M% K }# P8 r* x N' U5 Z' b参考文献 # b; g7 c7 \: ~( H , j) c( S) f8 s6 p+ ~[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25] / Q5 |3 R1 W$ b; `) k' _ h+ q2 {0 l3 Y) D' O% X8 Y$ t
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25] / e/ V7 {' q1 X% O# y9 [& d( u2 J 7 g- @( @) j) e0 w) H7 J1 C! g8. ( @$ @5 u; g' R- e9 K: m, U1 K附录) l; [ A* y9 T$ {3 a& S% T8 v* ^
9 C/ S% l, f& g0 x' ]4 H' e: H
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成): - Z! A* J; e& l) q, U5 S- j0 e3 V9 @) z6 ^- ?
%barcode.m r/ u* j6 s5 A6 a" g/ R) t
, c% G3 {, m$ s' d' j* X( N4 P
%生成学号a对应的条形码# q/ y" y0 x; V) D( n) N3 T* t
1 E1 x4 M/ B9 J3 Y* d%2011/09/25 13:24 BY小谷同学 3 O9 |% h. b9 I+ O, }, C. F8 [( ]+ @! a2 I% h! ]4 c& T; h; M4 M
a='1234567890123';%学号,自行更改 % Z1 H$ J& j! x + j2 |+ m) O2 ^7 ?1 jBlack_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; $ H, e; d- _" F. w2 Z$ } & G. D( o! a- k3 }- [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];%数字编码* l% V4 a+ ^/ D7 I! c
" u [ u. e3 L3 p+ Q7 A
White_num=[0,1,0,0,1];%插入符的编码 7 z& @% P, E9 N( m6 ^$ ?+ H8 o, @0 h* W t: `
%Black_SE='00110';( E4 C$ B: x0 g& N% T
: Y' P: I/ b# X X
%White_SE='10001';White_M='01001'; V- `+ ]1 p- X
8 _* V$ ]4 Z: L% ybarheight=30;%定义条形码的高度 2 P' ~* U( @ }/ O: [0 i5 Q5 I" T) ?: h) ^5 c z# d5 E0 w
barwidth=1;%定义条形码的像素宽度& e8 d2 C1 @* |/ H: @+ ^
1 M) @0 i2 k1 h* e6 r% P
& n/ {# J5 ]& U. h6 s: j3 D%可以对特定长度的输入进行控制,本文规定长度为13( U, K. h# z% Z' k3 v" X0 d
! y( N- a1 ]0 K k3 V
if length(a)~=13& e5 e" ~$ }0 p
$ S, s% y2 v( r- x; L/ q) U
$ r% {6 p4 R/ o5 oerror('图书证必须有13个数字'); 5 @! d9 o5 @ ~# N0 Y 1 t0 i7 [1 i( t! Y. [end * H2 a+ B/ E0 s+ w( ]& w+ ]+ u7 e# w3 e) q1 i7 g
6 H# D \+ H/ r. `* y* L
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1]; ; o- K! m9 ^( Q# ~3 C9 h# D$ Q/ a& Z" w 1 [* \% T7 u- x# t' d9 Q- e2 h%为方便,直接人工得出起始与终止部分的条形码 ' o& W Q0 X0 c- Q6 S- W* B. n2 y3 P, E3 O5 X( M: n
%也可以由程序生成.+ I, @# c: K0 S
8 B( @4 C2 }. F" m$ `" x0 N2 ]5 itotal=length(a)*(7+7); & Z$ M) }3 o T% J; ]3 x! e$ O J2 [+ u% t
%条形码的总像素宽 . d/ E$ m2 A5 X0 }; A3 |7 |) A6 |( w. F. D4 h& n
%也可以不用求,因MATLAB提供的均是动态数组$ N! R1 @+ a7 G