当前位置: 首页 > news >正文

SOUI基于Zint生成EAN码

EAN码广泛应用与欧洲的零售业。包括EAN-2、EAN-5、EAN-8和EAN-12码。分别编码 2、5、7 或 12 位数字。此外,可以使用 + 字符将 EAN-2 和 EAN-5 附加符号添加到 EAN-8 和 EAN-13 符号中,就像 UPC 符号一样。
EAN-8校验码计算:

  • 从左往右奇数位的数相加乘以3得出C1
  • 偶数位的数相加得出C2
  • C1+C2得出CC
  • 找到比CC大的最小10的倍数为CX
  • CX-CC的值即为校验码
    EAN-13校验码计算跟EAN-8计算规则一样。

例如:7432365
C1 = (5+3+3+7)*3; C1=54;
C2 =6+2+4; C2=12;
CC=C1+C2; CC=66;
CC=70;
校验码即为CX-CC; 70-66=4;

EAN码默认生成校验码文档中是这样描述的:
All of the EAN symbols include check digits which are added by Zint. If you are encoding an EAN-8 or EAN-13 symbol and your data already includes the check digit then you can use symbology BARCODE_EANX_CHK (14) which takes an 8 or 13-digit input and validates the check digit before encoding
下边我们一起来看看EAN-8跟EAN-13码生成相关的代码:

std::string strContent = "1234567";
CRect rcCode(0,0,200,50);

struct zint_symbol* symbol;
symbol = ZBarcode_Create();
symbol->symbology = BARCODE_EANX;  //BARCODE_EANX_CHK
symbol->input_mode = DATA_MODE; //数据编码格式
int nRet = ZBarcode_Encode_and_Buffer_Vector(symbol, (unsigned char*)strContent.c_str(), strContent.size(), 0);
if (nRet == 0)
{
    ZBarcode_Print(symbol, 0);
    //拿到绘制的所有黑色条
    int nMinLen = 500;
    int nMaxLen = 0;
    
    std::vector<CRect> vecBlackRect;
    if (symbol->vector)
    {
        struct zint_vector_rect* rect = symbol->vector->rectangles;
        while (rect)
        {
            CRect rcTmp;
            rcTmp.left = rect->x;
            rcTmp.top = rect->y;
            rcTmp.right = rcTmp.left + rect->width;
            rcTmp.bottom = rcTmp.top + rect->height;
            vecBlackRect.push_back(rcTmp);
            
            if (rect->height > nMaxLen) nMaxLen = rect->height;
            if (rect->height < nMinLen) nMinLen = rect->height;
             
            rect = rect->next;
        }
    }
    //计算在rcCode中绘制每个单位的宽跟标准的宽,主要绘制的时间用
    double nDrawUint = (double)rcCode.Width() / symbol->width;
    double nUint = (double)symbol->bitmap_width / symbol->width;
    
    std::vector<CRect> vecDrawBlack;  //绘制条码条的真实区域
    for (int i = 0; i < vecBlackRect.size(); i++)
    {
        //分出那些是绘制长条,那些绘制短条
        CRect rcTmp(vecBlackRect[i]);
        rcTmp.left = rcTmp.left / nUint * nDrawUint;
        rcTmp.right = rcTmp.right / nUint * nDrawUint;
        if (rcTmp.Height() == nMaxLen)
        {
            //长条  
            //实际绘制的rc的top跟bottom即为rcCode的top跟bottom   
        }
        else
        {
            //短条
            //此处如果要区分文本位置则需要特殊处理
            //如果文本在上边则绘制的rc的top为rcCode的top加上文本高度或者自定义的一个高度。rc的bottom为rcCode的bottom
            //如果文本在下边则绘制的rc的top为rcCode的top。rc的bottom为rcCode的bottom减去文本高度或者自定义的一个高度       
        }            
    }
    
    //拿到计算出的真实绘制区域然后再进行单个绘制或者以路径的方式绘制
    //TODO:
        
    //文本的绘制
    //EAN-8码的文本分成了2部分,在绘制时分别绘制即可
    //TODO:
}

EAN-13码的绘制基本与EAN-8相同,也是分出长短条再分别绘制。不同的地方在于再绘制EAN-13码时文本时分成3部分的(参考UPC-E码)。
对于EAN-2、EAN-5码以及组合码都可做相似的处理。
EAN-2、EAN-5码可作为EAN-8、EAN-13码的补充码出现。
比如:1234567+12(EAN8+EAN2)该数据在生成时是会生成一个EAN-8码跟EAN-2码在绘制时分开绘制即可。

另外在实际使用中如果传入的数据匹配不到对应的位数Zint会通过在数据前边添加0的方式来处理。
比如:传入1,位数达不到两位Zint会自动补个0使数据变为01然后再按EAN-2码格式编码;
传入123456,位数不够七位会自动补全成0123456然后再处理;
对于组合码也同样:123456+1位数不够,会自动补全成0123456+01然后在处理;

相关文章:

  • QT-信号与槽
  • deepseek、腾讯元宝deepseek R1、百度deepseekR1关系
  • 【自学笔记】Spring基础知识点总览-持续更新
  • Java的异常体系中的Error
  • 如何在网页上显示3D CAD PMI
  • Grok 3能否打破大模型的魔咒?
  • 【四.RAG技术与应用】【1.RAG技术揭秘:大模型与检索增强生成】
  • Error Density-dependent Empirical Risk Minimization
  • 基于IMM算法的目标跟踪,四模型IMM|三维环境|4个模型分别是:CV、左转CT、右转CT、CA(基于EKF,订阅专栏后可获得完整源代码)
  • 计算机视觉之dlib人脸关键点绘制及微笑测试
  • VMware虚拟机IP配置
  • GCC RISCV 后端 -- GCC 构建系统简介
  • 《2025软件测试工程师面试》功能测试篇
  • 6.人工智能与机器学习
  • 通过多线程分别获取高分辨率和低分辨率的H264码流
  • C与C++的区别
  • 大型语言模型中微调和提炼的详细技术比较
  • 【C++】可变模板参数和完美转发
  • 蓝桥杯 之 图形规律
  • rollup是什么?以及它和webpack 和vite的区别
  • 外交部:中美双方并未就关税问题进行磋商或谈判
  • 狄威已任国铁集团副总经理
  • “杭州六小龙”的招聘迷局
  • 【社论】用生态环境法典守护生态文明
  • 因高颜值走红的女通缉犯出狱后当主播自称“改邪归正”,账号已被封
  • 文旅部副部长饶权出任国家文物局局长