海思OSD开发系列(一) SDL_TTF框架移植

哗啦啦~ 2020-08-03 18:36:13 5289
需求

海思OSD显示,就是在region叠方块,我们常用的需求就是叠加 时间戳、通道名称、log等,做的好一点的可以实现二维码扫描方块显示、天气信息等等;

需求里就两类信息,一种字符、一种图片,最后的实现其实都一样,通通转成位图bmp叠上去就ok;

今天我们要做的就是搞字体;

字体
  • 点阵式字体
    安防领域,传统使用点阵式字体,顾名思义就是打点成像,跟老式的针式打印机一个道理;
    优点是字体小、所需资源少,适合内存和flash紧张的低端嵌入式设备;
    举栗:hzk16、asc16

  • 系统字体
    这种就和我们操作系统上用的一样,UI都用它,漂亮光滑细腻…
    举栗:wqy-microhei.ttc(文泉驿_微米黑)
    为什么选他?
    开源、自由、免费、漂亮…

为什么要用SDL_TTF

讲这么多,都没到正主,SDL是什么,SDL是一套开源多媒体框架,很多地方用来做播放器显示等相关的功能,我们要用到的SDL_TTF,顾名思义就是这个框架的字体模块
复习下前面讲的:

  1. 我们需要显示文字并选择了NB的字体
  2. 海思需要位图来叠osd
    这个两个加在一起就是,我们需要一个将字体转换成位图工具来制作位图使用osd模块显示!
    这个工具就是SDL_TTF!

啰嗦一大堆,不要再问我为甚要搞这个了!也因为这个实现很快,三个小时就可以搞定;

当然还有更简单也更复杂的方式,把时间位图格式数据转成多维数组载入在内存里面,每次只修改变化的数据,这样就全用代码实现了;提供思路给大家参考

下载

CSDN同学分享,交友网站下载github 整包,版本有点老,但好像也没影响

也可以官网自行下载freetype、SDL1、SDL_ttf这三个版本

freetype官网 下载Freetype-2.9

这里以github资源为例

交叉编译

编译freeType和SDL依赖

解压使用相同配置

./configure CC=aarch64-himix100-linux-gcc --host=arm-linux --prefix=$PWD/ARM_INSTALL

make -j99; make install
在INSTALL目录会生成我们需要的LIB和头文件

SDL_TTF编译
–with-sdl-prefix
–with-freetype-prefix
-with-freetype-exec-prefix
这里指定依赖,就是我们上一步刚刚编译好的目录
最好换成绝对路径
配置选项如下

./configure CC=aarch64-himix100-linux-gcc --host=arm-linux --prefix=$PWD/ARM_INSTALL  --with-sdl-prefix=../SDL-1.2.15/ARM_INSTALL --with-freetype-prefix=../freetype-2.4.10/ARM_INSTALL  --with-freetype-exec-prefix=../freetype-2.4.10/ARM_INSTALL

make -j99;make install
完成!!!
将include和lib目录拷贝出来就ok!

位图文件测试
主要步骤

  1. 初始化、打开字体
  2. 格式转换
  3. 存文件
#include <stdio.h>
#include "SDL.h"
#include "SDL_ttf.h"
#include<time.h>

int main(int argc, const char *argv[])
{
    char * pstr = "2019-11-21 15:40:29";
    SDL_PixelFormat *fmt;
    TTF_Font *font;  
    SDL_Surface *text, *temp;  

    if (TTF_Init() < 0 ) 
    {  
        fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());  
        SDL_Quit();
    }  

    font = TTF_OpenFont("/root/nfs_share/wqy-microhei.ttc", 48); 
    if ( font == NULL ) 
    {  
        fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", 48, "ptsize", SDL_GetError());  
    }  

    SDL_Color forecol = {  0xff, 0xff, 0xff, 0xff };  
    text = TTF_RenderUTF8_Solid(font, pstr, forecol);

    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;
    fmt->colorkey = 0xffffffff;
    fmt->alpha = 0xff;

    temp = SDL_ConvertSurface(text, fmt, 0);
    SDL_SaveBMP(temp, "save.bmp"); 

    SDL_FreeSurface(text);  
    SDL_FreeSurface(temp);
    TTF_CloseFont(font);  
    TTF_Quit();  

    return 0;
}
结果

BMP图片式样

OSD叠加式样

本文链接:https://blog.csdn.net/haysonzeng/article/details/106670568

相关推荐:

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
哗啦啦~
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

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

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区