EAN-13 条形码编程示例

 一个 EAN-13 条码拥有如下物理结构:
l         左手边警戒条,或开始哨,编码为 101 。
l         数制码的第二个字符,按照下面描述的左手边奇性的字符方式方式编码。
l         厂商码的 5 个字符,按照下面描述的左手边的方式编码。奇偶性的设置如下表1.1
l         中间警戒模式,编码为 01010 。
l         产品码的 5 个字符,按照下面描述的右手边字符方式进行编码。
l         校验位,按照下面描述的右手边字符方式进行编码。
l         右手边警戒条,或结束哨,编码为 101 。


我们将用数字“ 1 ”来表示条码的一个“暗”或“条”部分,
而用“ 0 ”来表示条码的一个“亮”或“空间”部分。

 编码示例
这个例子将对值“ 7501031311309 ”进行 EAN-13 编码。“ 75 ”是数制,
“ 01031 ”是厂商码,“ 31130 ”是产品码(“ 9 ”是校验位,在本例中
我们还是要进行计算)。

我们观察数制码的第一个数位(条码中最左边的那个数位)是数字“ 7 ”。
参照奇偶性编码表中的数字“ 7 ”,我们可以知道第二个数制位和厂商码
应该按照“奇 / 偶 / 奇 / 偶 / 奇 / 偶”的模式进行编码。这就是说第二个
数制位将按照“左手边奇数”性表进行编码,厂商码的第一个数位应该按照
“左手边偶数”性编码的,等等。现在,我们可以按照如下步骤来编制条码。
之后将所有字符串连接起来就构成了最终的条码。

使用编码表1.2

    左警戒条 (总是相同的): 101.
    第二数制位 [5]: 按照左手边奇数性进行编码, 0110001.
    厂商码第1个数位 [0]: 按照左手边偶数性进行编码, 0100111.
    厂商码第2个数位 [1]: 按照左手边奇数性进行编码, 0011001.
    厂商码第3个数位 [0]: 按照左手边偶数性进行编码, 0100111.
    厂商码第4个数位 [3]: 按照左手边奇数性进行编码, 0111101.
    厂商码第5个数位 [1]: 按照左手边偶数性进行编码, 0110011.
    中间警戒条 (总是相同的): 01010.
    产品码第1个数位 [3]: 按照右手边字符进行编码, 1000010.
    产品码第2个数位 [1]: 按照右手边字符进行编码, 1100110.
    产品码第3个数位 [1]: 按照右手边字符进行编码, 1100110.
    产品码第4个数位 [3]: 按照右手边字符进行编码, 1000010.
    产品码第5个数位 [0]: 按照右手边字符进行编码, 1110010.
    校验位 [9]: 按照右手边字符进行编码, 1110100.
    右边警戒条 (总是相同的): 101.

执行结果如下:


程序代码如下:
<html>
<head>
<title>
生成条形码
</title>
<script type="text/javascript" src="list.js"></script>    
<script type="text/javascript" src="set.js"></script>    
</head>
<body οnkeyup="whichButton(event)">
请输入要生成条形码的13位编号
<textarea id='txt1' rows="1" cols="80"></textarea>
<input type=button οnclick="make()" value="生成条形码"></input>
<textarea id='txt2' rows="4" cols="80"></textarea>

<canvas id="myCanvas" width="500" height="300"  style="background-color:#c0c0c0;border: 10px yellow solid" ></canvas>
<script>
var e=document.getElementById("myCanvas");
var cxt=e.getContext("2d");

//---------------wangwei 2022-10-23
function make()
{  
   var d=document.getElementById("txt2");
   var txt1=document.getElementById("txt1");
   var odd_even=[[0,0,0,0,0],[0,1,0,1,1],[0,1,1,0,1],[0,1,1,1,0],[1,0,0,1,1],[1,1,0,0,1],[1,1,1,0,0],[1,0,1,0,1],[1,0,1,1,0],[1,1,0,1,0]];
   var ean_character_code=[[0,0,0,1,1,0,1],[0,0,1,1,0,0,1],[0,0,1,0,0,1,1],[0,1,1,1,1,0,1],[0,1,0,0,0,1,1],[0,1,1,0,0,0,1],[0,1,0,1,1,1,1],[0,1,1,1,0,1,1],[0,1,1,0,1,1,1],[0,0,0,1,0,1,1]];
   var arr1=[-1,0];
   var pos=txt1.value.charCodeAt(0)-48;
   var temp1=odd_even[pos];
   var arr2=[2,2,2,2,2,2];
   var temp2=arr_concat(arr1,temp1);
   var cond_result=arr_concat(temp2,arr2);
   
   var result=get_bit_array(txt1.value,cond_result,ean_character_code);
   d.innerText=list(result,function(a){return a;});//txt1.value.charCodeAt(0);
   //reverse(ean_character_code[6])
   api_draw_bar_code(result);
}
function get_bit_array(str,cond,ean_character_code)
{
 var result=[1,0,1];
   for(var i=0;i<str.length;i++)
      {
         var num=str.charCodeAt(i)-48;
         var temp1=make_bit_arry(num,cond[i],ean_character_code);
        
         result=arr_concat(result,temp1);
          if(i==6)
          {result=arr_concat(result,[0,1,0,1,0]);}
      }
      result=arr_concat(result,[1,0,1]);
return result;
}
function make_bit_arry(num,cond,ean_character_code)
{
  var num_arr=ean_character_code[num];
  if (cond==0)
   {return num_arr;}
   else if(cond==1)
   {return reverse(bit_reverse(num_arr));}
   else if(cond==2)
   {return bit_reverse(num_arr);}
   else  {return [];}
}

function bit_reverse(arr)
{
      var result=[];
       for(var i=0;i<arr.length;i++)
           {result.push(1-arr[i]);
           }
   return result;
}

function api_draw_bar_code(arr)
{
cxt.fillStyle="black";
cxt.strokeStyle="black";
cxt.lineWidth=0;
var weight=2;
for(var i=0;i<arr.length;i++)
  {
      if(arr[i]==1)
      {
        if((i>2&&i<45)||(i>49&&i<92))    
            {cxt.rect(50+i*weight,50,1*weight,34*weight); }
         else
          {cxt.rect(50+i*weight,50,1*weight,40*weight); }
      }
        
  }
cxt.fill(); //cxt.stroke();
}
//------------------ end
</script>     
</body>
</html>

附录 表1.1

表1.2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王伟1982

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值