EAN码是国际物品编码协会制定的一种商品用条码,通用于全世界。EAN码符号有标准版(EAN-13)和缩短版(EAN-8)两种,我国的通用商品条码与其等效。我们日常购买的商品包装上所印的条码一般就是EAN码。我这里给出的是EAN-13的算法代码,大家如果需要EAN-8条码可以自行修改下。
* 函 数 名:EAN13()
* 功 能:根据条EAN-13码符号字符串生成条码位图
* 参 数:BM 字符型(12位EAN-13码符号字符串 如:'690102818039')
* 返 回 值:生成的条码位图的文件名
* 运行环境:WIN95以上版本。Visual FoxPro 6.0,7.0,8.0,9.0
* 算法制作:行者孙(QQ:310727570)-VFP应用程式算法群(12787940)
* 说 明:转载请保留出处!
Function EAN13(BM As String )
Private BM
Dimension EAN_code[10,3]
EAN_code[1,1]='00000011110011'
EAN_code[1,2]='00110000111111'
EAN_code[1,3]='11111100001100'
EAN_code[2,1]='00001111000011'
EAN_code[2,2]='00111100001111'
EAN_code[2,3]='11110000111100'
EAN_code[3,1]='00001100001111'
EAN_code[3,2]='00001111001111'
EAN_code[3,3]='11110011110000'
EAN_code[4,1]='00111111001100'
EAN_code[4,2]='00001111110011'
EAN_code[4,3]='11000000001100'
EAN_code[5,1]='00110000001111'
EAN_code[5,2]='00001111110011'
EAN_code[5,3]='11001111110000'
EAN_code[6,1]='00111100000011'
EAN_code[6,2]='00111111000011'
EAN_code[6,3]='11000011111100'
EAN_code[7,1]='00110011111111'
EAN_code[7,2]='00000011001111'
EAN_code[7,3]='11001100000000'
EAN_code[8,1]='00111111001111'
EAN_code[8,2]='00001100000011'
EAN_code[8,3]='11000000110000'
EAN_code[9,1]='00111100111111'
EAN_code[9,2]='00000011000011'
EAN_code[9,3]='11000011000000'
EAN_code[10,1]='00000011001111'
EAN_code[10,2]='00001100111111'
EAN_code[10,3]='11111100110000'
Dimension EAN_left[10]
EAN_left[1]='111111'
EAN_left[2]='112122'
EAN_left[3]='112212'
EAN_left[4]='112221'
EAN_left[5]='121122'
EAN_left[6]='122112'
EAN_left[7]='122211'
EAN_left[8]='121212'
EAN_left[9]='121221'
EAN_left[10]='122121'
Dimension EAN_mode[8]
Store '' To EAN_mode
If Len(Alltrim(BM))<>12 .And. Val(BM)>0
Messagebox('EAN-13编码长度不规范',268,'信息提示')
Return ''
Else
EAN_mode[1]='000000000000000000'
EAN_mode[2]='110011'
For i=0 To 9
If Val(Substr(BM,1,1))=i
For ii=1 To 6
BMZ=Val(Substr(BM,ii+1,1))
MODE=Val(Substr(EAN_left[i+1],ii,1))
EAN_mode[3]=EAN_mode[3]+EAN_code[BMZ+1,MODE]
Endf
Endi
Endf
EAN_mode[4]='0011001100'
For i=1 To 5
BMZ=Val(Substr(BM,i+7,1))
EAN_mode[5]=EAN_mode[5]+EAN_code[BMZ+1,3]
Endf
JY_A=0
JY_B=0
For i=1 To 12
If i%2=0
JY_A=JY_A+Val(Substr(BM,i,1))
Else
JY_B=JY_B+Val(Substr(BM,i,1))
Endif
Endf
JYM=10-(JY_A*3+JY_B)%10
If JYM=10
JYM=1
Endi
EAN_mode[6]=EAN_code[JYM+1,3]
EAN_mode[7]='110011'
EAN_mode[8]='000000000000000000'
EAN_code=EAN_mode[1]+EAN_mode[2]+EAN_mode[3]++EAN_mode[4]+EAN_mode[5]+EAN_mode[6]+EAN_mode[7]+EAN_mode[8]
Dimension BMP[4]
BMP[4]=90
BMP[3]=224
BMP[2]=Int((BMP[3]*3+3)/4)*4*BMP[4]+54
BMP[1]=BMP[2]-54
Dimension BMP_T[4]
For i=1 To 4
k1='0x'+Subs(Righ(Tran(BMP[i],"@0"),8 ),7,2)
k2='0x'+Subs(Righ(Tran(BMP[i],"@0"),8 ),5,2)
k3='0x'+Subs(Righ(Tran(BMP[i],"@0"),8 ),3,2)
k4='0x'+Subs(Righ(Tran(BMP[i],"@0"),8 ),1,2)
BMP_T[i]=Chr(&k1)+Chr(&k2)+Chr(&k3)+Chr(&k4)
Endf
st1='BM'+BMP_T[2]+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(54)+Chr(0)+Chr(0)+Chr(0);
+Chr(40)+Chr(0)+Chr(0)+Chr(0)+BMP_T[3]+BMP_T[4]+Chr(1)+Chr(0)+Chr(24)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+BMP_T[1]+Chrt(Spac(16),' ',Chr(0))
st2=Chrt(Spac(224*10*3),' ',Chr(255))
st3=''
For i=11 To 70
For k1=1 To 224
If Substr(EAN_code,k1,1)=='1'
st3=st3+Chr(0)+Chr(0)+Chr(0)
Else
st3=st3+Chr(255)+Chr(255)+Chr(255)
Endi
Endf
Endf
Pb=Chr(0)+Chr(0)+Chr(0)
Pw=Chr(255)+Chr(255)+Chr(255)
st4=Chrt(Spac(18*3),' ',Chr(255))+Pb+Pb+Pw+Pw+Pb+Pb+Chrt(Spac(84*3),' ',Chr(255))+Pw+Pw+Pb+Pb+Pw+Pw+Pb+Pb+Pw+Pw+Chrt(Spac(84*3),' ',Chr(255))+Pb+Pb+Pw+Pw+Pb+Pb+Chrt(Spac(16*3),' ',Chr(255))
st4=st4+st4
Dimension T_D[11]
T_D[1]='11111000111111111100000111111110111100111111101111101111111011111011111110111110111111101111101111'+;
'11101111101111111011111011111110111110111111101111101111111011110011111111000001111111111000111111'
T_D[2]='11111110111111111111001111111111100011111111100000111111111011101111111111111011111111111110111111'+;
'11111110111111111111101111111111111011111111111110111111111111101111111111111011111111111110111111'
T_D[3]='11111000111111111000000111111110111110111111101111101111111111111011111111111110111111111111011111'+;
'11111110011111111111001111111111100111111111110011111111111001111111111110000000111111000000001111'
T_D[4]='11111000111111111100000111111110011100111111101111101111111111110111111111110011111111111100011111'+;
'11111111101111111111111011111111111110111111101111101111111011110011111111000001111111111000111111'
T_D[5]='11111111011111111111100111111111111001111111111100011111111110110111111111011101111111110111011111'+;
'11101111011111110111110111111100000000011111000000000111111111110111111111111101111111111111011111'
T_D[6]='11110000001111111100000011111111011111111111110111111111111000001111111110000001111111101111101111'+;
'11111111101111111111111011111111111110111111101111101111111011110011111111000001111111111000111111'
T_D[7]='11111000111111111100000111111110011110111111101111111111111011001111111110000001111111100111001111'+;
'11101111101111111011111011111110111110111111101111101111111001111011111111000001111111111000111111'
T_D[8]='11000000001111110000000011111111111100111111111111011111111111101111111111111011111111111101111111'+;
'11111101111111111110011111111111101111111111111011111111111110111111111111101111111111110011111111'
T_D[9]='11111000111111111100000111111110011100111111101111101111111011111011111110011100111111110000011111'+;
'11110000011111111011111011111110111110111111101111101111111011111011111110000001111111111000111111'
T_D[10]='11111000111111111100000111111110111100111111101111101111111011111011111110111110111111101111101111'+;
'11101111001111111100000011111111100110111111111111101111111011110111111110000001111111111001111111'
T_D[11]='11111111111111111111111111111111111111111111111111001111111111000011111111000001111111100111111111'+;
'11100111111111111100000111111111110000111111111111001111111111111111111111111111111111111111111111'
Dimension td[14]
Store '' To td
For i=1 To 14
For k1=1 To 13
zh=Val(Substr(BM+Alltrim(Str(JYM)),k1,1))+1
td[i]=td[i]+Substr(T_D[zh],14*i-13,14)
Endf
td[i]=td[i]+Substr(T_D[11],14*i-13,14)
Endf
For i=1 To 7
td[i]='11'+Subs(td[i],1,14)+'11'+'001100'+Subs(td[i],15,84)+'1100110011'+Subs(td[i],99,84)+'001100'+Subs(td[i],183,14)+'11'
Endf
For i=8 To 14
td[i]='11'+Subs(td[i],1,14)+'11'+'111111'+Subs(td[i],15,84)+'1111111111'+Subs(td[i],99,84)+'111111'+Subs(td[i],183,14)+'11'
Endf
For i=1 To 14
td[i]=Strtran(td[i],'1',Chr(255)+Chr(255)+Chr(255))
td[i]=Strtran(td[i],'0',Chr(0)+Chr(0)+Chr(0))
Endf
st5=Chrt(Spac(224*4*3),' ',Chr(255))
h=Fcreate(BM+Alltrim(Str(JYM))+'.bmp')
=Fwrite(h,st1)
=Fwrite(h,st5)
For i=14 To 1 Step -1
=Fwrite(h,td[i])
Endf
=Fwrite(h,st4)
=Fwrite(h,st3)
=Fwrite(h,st2)
Fclose(h)
Return BM+Alltrim(Str(JYM))+'.bmp'
Endif
调用方法:如如:thisform.image1.picture=EAN13('6901028039')
调用效果:[/img]
_________________
╭⌒╮VFP应用程式算法群 12787940¤╭⌒
╭http://hi.baidu.com/myvfp/blog
,︶︶︶︶,""︶~~ ,""~︶︶ ,""
╱◥█◣ ╱◥█◣
︱田︱田︱︱田︱田︱
╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
http://hi.baidu.com/myvfp/blog
以上是转载来至互联网的vfp函数,但由于函数中存在多处错误。经常导致条码无法识别。
下面将错误位置指出并纠正
出错的语句:
EAN_code[4,1]='00111111001100'
EAN_code[4,2]='00001111110011'
EAN_code[7,2]='00000011001111'
JYM=10-(JY_A*3+JY_B)%10
If JYM=10
JYM=1
Endi
纠正后的语句:
EAN_code[4,1]='00111111110011'
EAN_code[4,2]='00110000000011'
EAN_code[7,2]='00000000110011'
JYM=10-(JY_A*3+JY_B)%10
If JYM=10
JYM=0
Endif