ngswfx

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx  发布于  2016-07-22 09:49:21
采纳率 0%
55个问答
3366

超大数字显示

 
本帖最后由 ngswfx 于 2016-7-22 17:37 编辑

这几天弄数字矩阵,希望能把某个单元的序号显示出来,但是普通的文字太小,实际使用中根本看不见。现场安装调试带来不便。

//开始想着弄true type矢量字体,看了看相关的支持库,最后一想,这东西太大,太费劲。

自己做了0-9的bmp格式的图片,每张图片原始大小145K,分辨率176*288。10个图片共计1.45M。进过gzip压缩,实际只有20k flash占用,非常满意。这是肯定的,都是黑屏,有效信息非常少,而且单色,压缩成这样应该的。之所以不用jpg,是因为在bmp转jpg过程中,反而会带来边缘的躁动,带来额外信息,对后期压缩成zip,对空间占用反而有影响。

//////操作流程如下。
1、将所有图片在pc上压缩为标准zip格式,例如0.bmp---------0.zip
2、将所有zip文件全部放入roofs指定目录。例如/root/Num/目录下。
3、程序运行中,如果需要某个数字图片,执行命令gzip -cd /root/Num/n.zip>/dev/n.bmp   /////由于dev目录是内存目录,肯定是可写的。如果需要多个数字,就都解压出来然后读取。由于对于一个单元来说最多用2个数字,额外内存占用,也就145K*2=300K左右。而且是用完就删除了,能够接受。
4、通过读取/dev/n.bmp文件,通过fb OSD方式叠加屏幕上显示(看demo有实例,自己堆积代码,调试一下流程即可),
5、使用结束后,删除/dev/n.bmp文件。


//////////当然你通过获取几个数字,然后位置组合,就可以实现几位数字的显示了,例如:998,我的代码中仅仅显示99以内,如果一位数字就显一位,2位就显示2位,没有显示01这种。

//////////超级大,呵呵,这下,满足需求了,而flash占用仅仅20K左右


///简单制作后,其实可以再做26个英文字母,以及常见的标点符号,这样,就可以超大英文显示了。而且最后整体空间占用也不会太大,弄50个左右的字符,估计压缩后也就是100K以内。就是显示的时候控制好那些字符解压出来即可。


/////////////////////////////代码中有一个缓冲其实没有使用。直接拷贝代码肯定不能运行,好多变量参数没给出,仅供参考流程。
[code]

int Check_InitOSD_ENV()
{
        if(fdOSD!=0)
                return fdOSD;
        ///////////////////////////////////////////////
        HI_S32 s32Ret =         HI_SUCCESS;
        HIFB_LAYER_INFO_S         stLayerInfo;
        HI_BOOL                         Show;
        HI_BOOL                         bCompress = HI_TRUE;
        HIFB_POINT_S stPoint = {0};
        struct fb_var_screeninfo stVarInfo;
        char file[12] = "/dev/fb0";
        HIFB_COLORKEY_S         stColorKey;
        HI_U32                                 maxW,maxH,u32Frm;//指的是屏幕宽度高度
        //////////////////////////////////////////
        strcpy(file, "/dev/fb0");
        fdOSD = open(file, O_RDWR, 0);
        if(fdOSD < 0)
                return 0;
        s32Ret = ioctl(fdOSD, FBIOGET_VSCREENINFO, &stVarInfo);
        if(s32Ret < 0){
                close(fdOSD);fdOSD=0;
                return 0;
        }
        SAMPLE_COMM_VO_GetWH(_VIDOE_OUT_RESOLUTION,(HI_U32*)&_nWndWidth,(HI_U32*)&_nWndHeight,&u32Frm);
        maxW=704;
        maxH=576;
        stVarInfo.xres =maxW;
        stVarInfo.yres =maxH;
        //虚拟分辨率
        stVarInfo.xres_virtual = maxW;
        stVarInfo.yres_virtual = maxH;
        stVarInfo.red = g_r32;
        stVarInfo.green = g_g32;
        stVarInfo.blue = g_b32;
        stVarInfo.transp = g_a32;
        stVarInfo.bits_per_pixel = 32;
        stVarInfo.activate=FB_ACTIVATE_NOW;
        stVarInfo.xoffset=0;
        stVarInfo.yoffset=0;
        s32Ret = ioctl(fdOSD, FBIOPUT_VSCREENINFO, &stVarInfo);
        if(s32Ret < 0){
                close(fdOSD);fdOSD=0;
                return 0;
        }
        stColorKey.bKeyEnable = HI_TRUE;
        stColorKey.u32Key = BK_SCR_TRANS_COLOR_KEY;
        if (ioctl(fdOSD, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
        {
                close(fdOSD);fdOSD=0;
                return 0;
        }
        if (ioctl(fdOSD, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0){
                close(fdOSD);fdOSD=0;
                return 0;
        }
        stLayerInfo.BufMode = HIFB_LAYER_BUF_ONE;
        stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE; // HIFB_LAYERMASK_BUFMODE HIFB_LAYERMASK_ANTIFLICKER_MODE
        stLayerInfo.u32DisplayWidth = _nWndWidth;
        stLayerInfo.u32DisplayHeight = _nWndHeight;
        stLayerInfo. s32XPos = 0;
        stLayerInfo. s32YPos = 0;
        stLayerInfo.u32Mask |= HIFB_LAYERMASK_DISPSIZE;  //HIFB_LAYERMASK_POS
        s32Ret = ioctl(fdOSD, FBIOPUT_LAYER_INFO, &stLayerInfo);
        if(s32Ret < 0){
                close(fdOSD);fdOSD=0;
                return 0;
        }
        //printf("Check_InitOSD_ENV: pos6.1 \n");
        if (ioctl(fdOSD, FBIOPUT_COMPRESSION_HIFB, &bCompress) < 0)
        {
                close(fdOSD);fdOSD=0;
                return 0;
        }
        Show = HI_TRUE;
        if (ioctl(fdOSD, FBIOPUT_SHOW_HIFB, &Show) < 0){
                close(fdOSD);fdOSD=0;
                return 0;
        }
        if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(stOsdCanvasBuf.stCanvas.u32PhyAddr), ((void**)&pOSDBuf),NULL, NULL, maxW*maxH*2)){
                close(fdOSD);fdOSD=0;
                return 0;
        }
        stOsdCanvasBuf.stCanvas.u32Height = maxH;
        stOsdCanvasBuf.stCanvas.u32Width = maxW;
        stOsdCanvasBuf.stCanvas.u32Pitch = maxW*2;
        stOsdCanvasBuf.stCanvas.enFmt = HIFB_FMT_ARGB1555;//HIFB_FMT_RGB565 HIFB_FMT_ARGB1555 HIFB_FMT_RGB888
        memset(pOSDBuf, BK_SCR_TRANS_COLOR_KEY, stOsdCanvasBuf.stCanvas.u32Pitch*stOsdCanvasBuf.stCanvas.u32Height);
    return fdOSD;
}
//清空显示的OSD信息,使避免窗体分割切换时,OSD残影
bool ClearShowOsd()
{
#ifdef SUPPORT_OSD
        if(!bCanUseOSD)
                return false;
        fdOSD=Check_InitOSD_ENV();
        if(!fdOSD)
                return false;
        if(!pOSDBuf)
                return false;
        HI_S32 s32Ret =         HI_SUCCESS;
        HI_U32                                 maxW=704,maxH=576;
        ///////////////////////////////////////////////////////////////////////////////
        memset(pOSDBuf,BK_SCR_TRANS_COLOR_KEY,maxW*maxH*2);
        ////////////////////////////////////////////////////////////////////
        stOsdCanvasBuf.UpdateRect.x = 0;
        stOsdCanvasBuf.UpdateRect.y = 0;
        stOsdCanvasBuf.UpdateRect.w = maxW;
        stOsdCanvasBuf.UpdateRect.h = maxH;
        if(fdOSD)
                s32Ret = ioctl(fdOSD, FBIO_REFRESH, &stOsdCanvasBuf);
        if(s32Ret < 0)
        {
                DebugInfEx(DBG_LEVEL1,"REFRESH failed!\n");
                HI_MPI_SYS_MmzFree(stOsdCanvasBuf.stCanvas.u32PhyAddr, pOSDBuf);
                close(fdOSD);
                fdOSD=0;
                return false;
        }
#endif

        return true;
}
void CheckInitOsdRGB(char **pOSDRGB)
{
        if(!*pOSDRGB){
                HI_U32                                 maxW=704,maxH=576;
                *pOSDRGB=new char[maxW*maxH*2];
                memset(*pOSDRGB,BK_SCR_TRANS_COLOR_KEY,maxW*maxH*2);
        }
}
HI_S32 IVHI_LoadBmp(const HI_CHAR *filename, BITMAP_S *pstBitmap)
{
    OSD_SURFACE_S Surface;
    OSD_BITMAPFILEHEADER bmpFileHeader;
    OSD_BITMAPINFO bmpInfo;
    if(GetBmpInfo(filename,&bmpFileHeader,&bmpInfo) < 0)
    {
            printf("GetBmpInfo err!\n");
        return HI_FAILURE;
    }
    Surface.enColorFmt = OSD_COLOR_FMT_RGB1555;
    pstBitmap->pData = malloc(2*(bmpInfo.bmiHeader.biWidth)*(bmpInfo.bmiHeader.biHeight));
    if(NULL == pstBitmap->pData)
    {
        printf("malloc osd memroy err!\n");
        return HI_FAILURE;
    }
    CreateSurfaceByBitMap(filename,&Surface,(HI_U8*)(pstBitmap->pData));
    pstBitmap->u32Width = Surface.u16Width;
    pstBitmap->u32Height = Surface.u16Height;
    pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555;
    return HI_SUCCESS;
}
void SolveNumBitMap(int nNum,bool bCtreatOkDel)
{
        int nNum1=nNum/10;
        int nNum2=nNum%10;
        bool bOneNum=false;
        if(nNum1==0)
                bOneNum=true;
        char strCmd[128];
        memset(strCmd,0,sizeof strCmd);
        if(bOneNum){
                if(bCtreatOkDel)
                        sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum2,nNum2);
                else
                        sprintf(strCmd,"rm /dev/%d.bmp",nNum2);
                system(strCmd);
        }else{
                if(bCtreatOkDel)
                        sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum1,nNum1);
                else
                        sprintf(strCmd,"rm /dev/%d.bmp",nNum1);
                system(strCmd);
                memset(strCmd,0,sizeof strCmd);
                if(bCtreatOkDel)
                        sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum2,nNum2);
                else
                        sprintf(strCmd,"rm /dev/%d.bmp",nNum2);
                system(strCmd);
        }
}
////////////////显示当前显示器全局序号
int IVHI_HDEC_ShowDisplayerNum(int nNum)
{
        printf("IVHI_HDEC_ShowDisplayerNum :%d bCanUseOSD:%d fdOSD:%d\n",nNum,bCanUseOSD,fdOSD);
        if(nNum<0||nNum>99)
                return false;
        if(bBigGlobolNumShowed){
                ClearShowOsd();
                bBigGlobolNumShowed=false;
                SolveNumBitMap(nNum,false);
                return true;
        }
        if(!bCanUseOSD)
                return false;
        SolveNumBitMap(nNum,true);
        //直接读取相应的bmp图片,然后在fb上显示出来
        BITMAP_S         stBitmap1;
        BITMAP_S         stBitmap2;
        memset(&stBitmap1,0,sizeof(BITMAP_S));
        memset(&stBitmap2,0,sizeof(BITMAP_S));
        char strFile[32];
        int nNum1=nNum/10;
        int nNum2=nNum%10;
        bool bOneNum=false;
        if(nNum1==0)
                bOneNum=true;
        memset(strFile,0,sizeof strFile);
        int s32Ret=0;
        if(bOneNum==false){
                sprintf(strFile,"/dev/%d.bmp",nNum1);
                if(!IsFileExist(strFile)){
                        SolveNumBitMap(nNum,false);
                        return false;
                }
                s32Ret = IVHI_LoadBmp(strFile, &stBitmap1);
        }
        memset(strFile,0,sizeof strFile);
        sprintf(strFile,"/dev/%d.bmp",nNum2);
        if(!IsFileExist(strFile)){
                printf("IVHI_HDEC_ShowDisplayerNum :%s not exist\n",strFile);
                if (NULL != stBitmap1.pData)
                {
                        free(stBitmap1.pData);
                        stBitmap1.pData = NULL;
                }
                SolveNumBitMap(nNum,false);
                return false;
        }
        s32Ret = IVHI_LoadBmp(strFile, &stBitmap2);
        ///////////////////////////////////////////////
        if(bOneNum==false){
                printf("bmp 1 w:%d h:%d\n",stBitmap1.u32Width,stBitmap1.u32Height);
        }
        printf("bmp 2 w:%d h:%d\n",stBitmap2.u32Width,stBitmap2.u32Height);
        char *pOSDRGB=NULL;
        CheckInitOsdRGB(&pOSDRGB);
        fdOSD=Check_InitOSD_ENV();
        if(fdOSD<1)
                DebugInfEx(DBG_LEVEL4,"fdosd :%d !\n",fdOSD);
        if(!fdOSD){
                if (NULL != stBitmap1.pData)
                {
                        free(stBitmap1.pData);
                        stBitmap1.pData = NULL;
                }
                if (NULL != stBitmap2.pData)
                {
                        free(stBitmap2.pData);
                        stBitmap2.pData = NULL;
                }
                SolveNumBitMap(nNum,false);
                return false;
        }
        HIFB_COLORKEY_S         stColorKey;
        stColorKey.bKeyEnable = HI_TRUE;
        stColorKey.u32Key = 0x0;
        if (ioctl(fdOSD, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
        {
                printf("IVHI_HDEC_ShowDisplayerNum FBIOPUT_COLORKEY_HIFB :%d\n",fdOSD);
                close(fdOSD);fdOSD=0;
                if (NULL != stBitmap1.pData)
                {
                        free(stBitmap1.pData);
                        stBitmap1.pData = NULL;
                }
                if (NULL != stBitmap2.pData)
                {
                        free(stBitmap2.pData);
                        stBitmap2.pData = NULL;
                }
                SolveNumBitMap(nNum,false);
                return false;
        }
        /////////////////////////////////////////
        bBigGlobolNumShowed=true;
        ClearShowOsd();
        //////////////////////////////////
        HI_U32                                 maxW=704,maxH=576;  //176*288
        memset(pOSDBuf,0x0,maxW*maxH*2);
        HI_U32 nLeftTopX=176;
        HI_U32 nLeftTopY=144;
        if(bOneNum==false){
                for(HI_U32 y=nLeftTopY;y                         if((y-nLeftTopY)>stBitmap1.u32Height)
                                break;
                        //少拷贝最后一个像素
                        memcpy(pOSDBuf+y*maxW+nLeftTopX,stBitmap1.pData+(y-nLeftTopY)*stBitmap1.u32Width*2,stBitmap1.u32Width*2);
                }
        }
        if(bOneNum==false){
                nLeftTopX=352;
                nLeftTopY=144;
        }else{
                nLeftTopX=352-88;
                nLeftTopY=144;
        }
        for(HI_U32 y=nLeftTopY;y                 if((y-nLeftTopY)>stBitmap2.u32Height)
                        break;
                //少拷贝最后一个像素
                memcpy(pOSDBuf+y*maxW+nLeftTopX,stBitmap2.pData+(y-nLeftTopY)*stBitmap2.u32Width*2,stBitmap2.u32Width*2);
        }
        if(pOSDRGB){
                delete pOSDRGB;
                pOSDRGB=NULL;
        }
        ///////////////
        stOsdCanvasBuf.UpdateRect.x = 0;
        stOsdCanvasBuf.UpdateRect.y = 0;
        stOsdCanvasBuf.UpdateRect.w = maxW;
        stOsdCanvasBuf.UpdateRect.h = maxH;
        if(fdOSD)
                s32Ret = ioctl(fdOSD, FBIO_REFRESH, &stOsdCanvasBuf);
        /////////////////////////////////////////////
        if (NULL != stBitmap1.pData)
        {
                free(stBitmap1.pData);
                stBitmap1.pData = NULL;
        }
        if (NULL != stBitmap2.pData)
        {
                free(stBitmap2.pData);
                stBitmap2.pData = NULL;
        }

        SolveNumBitMap(nNum,false);
        ///////////////////////////////////////////////////////
        return true;
}[/code]
易百纳技术社区文件: Num.tar.gz
下载
我来回答
回答3个
时间排序
认可量排序

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-22 10:03:23
认可0
好大呀,这回满意了吧:lol

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-22 10:22:58
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34558&ptid=12044]ngswfx 发表于 2016-7-22 10:03[/url]
好大呀,这回满意了吧[/quote]

大神总是有干货, 赞一个

domenor

0个粉丝

17

问答

0

专栏

1

资料

domenor 2016-07-22 16:52:16
认可0
很犀利,原理也很清晰,这种方法不错,顶一下
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区