中文OSD显示机制

在IP摄像机的实时视频流上面打上摄像机名称,公司logo和时间戳,就要用到OSD功能。
GM8126有四个osd win,在每个osd win中,支持的font是12x18点阵,32个char。
在这种条件下,如何实现下述功能:
1、OSD如何显示64个英文字母及+-/*:空格在内的字符组成的英文overlay。
2、如何让英文overlay大一点,12x16字体有点小。
3、如何分二行,三行显示overlay。
4、如何显示中文?中文的字体用24x24字库。
5、中文和英语用不同的字库,如何实现。
6、中文分两行显示。
上面的需求都可以实现,关键设计要点:
1、点阵动态加载,要显示的才加载入osd显存。
2、用2个或4个win来拼装显示bigger En or Zh。
3、既然有4个win,最多可以有4行。
4、动态生成字符点阵驱动,这样显示中文,英文或是任何一个图片都是可能的。
拼装一个24x24汉字关键算法:
            ret=fread(&font, 1,96, fp);    //读入这个汉字的点阵驱动,可以是根据汉字GM2312/BIG5字库来动态生成的。
            if(ret != 96)
            {
                printf("Font corrupt!\n");ret=-3;break;
            }
            
            //win0显示汉字上面2个char
            FontZhUpTable[FontUpCnt].font = ZhFontUpIndex;    //生成汉字的index
            memcpy(&FontZhUpTable[FontUpCnt].fbitmap[8],&font[0],24);    //载入osd显存, win0
            pWinUp[FontUpCnt]=ZhFontUpIndex;    //要显示的char的index
            FontUpCnt++;ZhFontUpIndex++;gFontCntAll++;

            FontZhUpTable[FontUpCnt].font = ZhFontUpIndex;    //一个汉字由4个char组成,所以index要不同
            memcpy(&FontZhUpTable[FontUpCnt].fbitmap[8],&font[24],24);    //载入osd win0
            pWinUp[FontUpCnt]=ZhFontUpIndex;
            FontUpCnt++;ZhFontUpIndex++;gFontCntAll++;
            //win2显示汉字下面2个char
            FontZhDnTable[FontDnCnt].font = ZhFontDnIndex;
            memcpy(&FontZhUpTable[FontDnCnt].fbitmap[8],&font[48],24);    //osd win2
            pWinDn[FontDnCnt]=ZhFontDnIndex;
            FontDnCnt++;ZhFontDnIndex++;gFontCntAll++;
            
            FontZhDnTable[FontDnCnt].font = ZhFontDnIndex;
            memcpy(&FontZhUpTable[FontDnCnt].fbitmap[8],&font[72],24);    //osd win2
            pWinDn[FontDnCnt]=ZhFontDnIndex;
            FontDnCnt++;ZhFontDnIndex++;gFontCntAll++;

            if (FontUpCnt>=OSD_4WIN_LEN)        //continue to use win1&3,如果要显示的overlay比较长的话!
            {
                pWinUp=gZhTextWin1[ucStreamId];FontUpCnt=0;
                pWinDn=gZhTextWin3[ucStreamId];FontDnCnt=0;
                continue;
            }

            if (gFontCntAll>=OSD_2WIN_LEN)
            {
                ret=2;goto End;
            }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

草根大哥

进军大神程序员路上,谢谢支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值