OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6553|回复: 7

Zint条码库实现生成各种条码二维码

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-9-6
在线时间
13 小时
发表于 2017-6-12 16:40:01 | 显示全部楼层 |阅读模式
通过裁剪Zint条码生成库,由于运行生成条码的代码时需要很大的RAM,所以在这里我将代码编译到外部SDRAM实现,EMWIN内存设备实现绘图显示。内容有点多,,有兴趣的朋友可以找我,,,,绝对不是键盘侠!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-9-6
在线时间
13 小时
 楼主| 发表于 2017-6-12 16:43:44 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-9-6
在线时间
13 小时
 楼主| 发表于 2017-6-13 14:30:51 | 显示全部楼层
MUer 发表于 2017-6-12 16:43
Q270933662 注明目的

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_EXRAM1 0xC1E0C000 0x1F4000        {
  ;2of5.o (+RW +ZI)
  ;auspost.o (+RW +ZI)
  ;aztec.o (+RW +ZI)
  ;code.o (+RW +ZI)
  ;code1.o (+RW +ZI)
  ;code16k.o (+RW +ZI)
  ;code49.o (+RW +ZI)
  code128.o (+RW +ZI)
  qr.o (+RW +ZI)
  upcean.o (+RW +ZI)
  ;common.o (+RW +ZI)
  ;composite.o (+RW +ZI)
  ;dllversion.o (+RW +ZI)
  .ANY1 (+RW +ZI)
  }
  RW_IRAM1 0x20000000 0x00030000        {  ; RW data
  startup_stm32f429xx.o(STACK)
  .ANY2 (+RW +ZI)
  }
}

这是 SCT链接脚本代码
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-9-6
在线时间
13 小时
 楼主| 发表于 2017-6-13 14:34:57 | 显示全部楼层
MUer 发表于 2017-6-13 14:30
LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000   ...

static WM_HMEM GetBarcodeImage(DATAFORMAT *Msg)
{
        GUI_RECT ImageSize;
        struct zint_symbol* my_symbol = ZBarcode_Create();
        int fd;
        U32 len;
        int i;
        U16      x1=0,y1=0;
        char *barCodeData;
        WM_HMEM hMem;
        switch(Msg->GeneralPara0)
        {
        case 0:
                my_symbol->symbology = BARCODE_CODE128;
                break;
        case 1:
                my_symbol->symbology = BARCODE_EANX;
                break;
        case 2:
                my_symbol->symbology = BARCODE_QRCODE;
                break;
        }
        fd = ZBarcode_Encode(my_symbol,Msg->DispProp,0);
        Msg->GeneralPara4 = my_symbol->rows;
        len = my_symbol->rows*(1 + my_symbol->width);
        barCodeData = (char*)mymalloc(SRAMIN,len);
         for (int r = 0; r < my_symbol->rows; r++)
                {
                         for (i = 0; i < my_symbol->width; i++)
                         {
                                        barCodeData[r*(my_symbol->width + 1) + i] = module_is_set(my_symbol, r, i) ? '1' : '0';
                         }
                         barCodeData[r*(my_symbol->width + 1) + i] = ',';
                }
        ImageSize.x0 = 0;
        ImageSize.y0 = 0;
        if(Msg->GeneralPara4 == 0){
                #if DEBUG
                printf("Code error");
                #endif
                ImageSize.x1 = 120;
                ImageSize.y1 = 30;
        }
        else if(Msg->GeneralPara4 == 1)
        {
                ImageSize.x1 = (my_symbol->width+1)*Msg->GeneralPara2;
                ImageSize.y1 = Msg->GeneralPara1;
        }
        else
        {
                ImageSize.x1 = my_symbol->width*Msg->GeneralPara1;
                ImageSize.y1 = Msg->GeneralPara2*my_symbol->rows*Msg->GeneralPara1;
                if(ImageSize.y1 > 154)
                        ImageSize.y1 = 154;
        }
  ZBarcode_Delete(my_symbol);

        hMem = GUI_MEMDEV_CreateFixed(0, 0, ImageSize.x1, ImageSize.y1, GUI_MEMDEV_NOTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_888);
        GUI_MEMDEV_Select(hMem);
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();
        if(Msg->GeneralPara4 == 0)
        {
                GUI_SetFont(System24_Font);
                GUI_SetTextMode(GUI_TM_TRANS);
                GUI_SetColor(GUI_BLACK);
                GUI_DispStringAt(tr("Code error"),2,2);
        }
        else if(Msg->GeneralPara4 == 1)    //画条码
        {
                        for(int i=0; i<len-1;i++)
                        {
                                        if(barCodeData == '1')
                                        {
                                                        GUI_SetColor(GUI_BLACK);
                                        }
                                        else if(barCodeData == '0')
                                        {
                                                        GUI_SetColor(GUI_WHITE);
                                        }
                                        x1 +=  Msg->GeneralPara2;
                                        GUI_FillRect(x1, y1, x1 + Msg->GeneralPara2, y1 + Msg->GeneralPara1);
                        }
        }
        else        //画二维码
        {
                        for(int i=0; i<len;i++)
                        {
                                        if(barCodeData == '1')
                                        {
                                                        GUI_SetColor(GUI_BLACK);
                                        }
                                        else if(barCodeData == '0')
                                        {
                                                        GUI_SetColor(GUI_WHITE);
                                        }
                                        if(barCodeData==',')
                                        {
                                                        x1 = 0;
                                                        y1 += Msg->GeneralPara1* Msg->GeneralPara2;
                                        }
                                        else
                                        {
                                                        GUI_FillRect(x1, y1, x1 + Msg->GeneralPara1, y1 + Msg->GeneralPara1* Msg->GeneralPara2);
                                                        x1 += Msg->GeneralPara1;
                                        }
                        }
        }
        GUI_MEMDEV_Select(0);
        myfree(SRAMIN,barCodeData);
        Msg->XSize = ImageSize.x1;
        Msg->YSize = ImageSize.y1;
        return hMem;
       
}


这是绘制条码二维码的代码,更改或添加SWITCH中的条码类,即可添加所想要的条码类
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-9-6
在线时间
13 小时
 楼主| 发表于 2017-6-13 15:23:17 | 显示全部楼层
MUer 发表于 2017-6-13 14:34
static WM_HMEM GetBarcodeImage(DATAFORMAT *Msg)
{
        GUI_RECT ImageSize;

有图有真相
PrintScreen00002.png
回复 支持 反对

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2017-8-28 13:21:12 | 显示全部楼层
你好,原码可以公开一下吗?最近也在研究用STM32生成二维码显示,谢谢了
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-9-6
在线时间
13 小时
 楼主| 发表于 2017-12-20 09:01:46 | 显示全部楼层
钩月黄昏 发表于 2017-8-28 13:21
你好,原码可以公开一下吗?最近也在研究用STM32生成二维码显示,谢谢了

条码二维码生成源码就是我上边提供的,在你的源文件添加上Zint条码库所需包含文件就可以了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-9-30
在线时间
16 小时
发表于 2020-6-6 12:24:26 | 显示全部楼层
DATAFORMAT结构是什么样的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表