大连网站建设外包公司商丘网络第一媒体

pingmian/2025/10/12 7:27:50/文章来源:
大连网站建设外包公司,商丘网络第一媒体,电脑当网站空间,做海报用的图片网站在流媒体项目中字幕显示是不可或缺的一环#xff0c;一般会有字幕流在视频播放过程中进行显示#xff1b;不过还有很多情况是从头到尾只在视频的某个区域显示某些文字#xff0c;例如某个电视台的log#xff1b;这种也称为字幕#xff0c;如果想要将这些字符串显示到视频一般会有字幕流在视频播放过程中进行显示不过还有很多情况是从头到尾只在视频的某个区域显示某些文字例如某个电视台的log这种也称为字幕如果想要将这些字符串显示到视频需要将这些字符串做成位图进行显示无法直接显示freetype开源库就是将字符转化为位图的工具。 做了几个freetype的项目之后总结的几个难点 1.utf8或者gb2312等中文如何生成位图 画布和freetype是无法处理中文编码的像GB2312或UTF8等中文编码需要转换成unicode编码才能够被处理显示字符串的编码转换可以使用iconv库进行编码转换想要了解更多iconv库的详细情况关注我后期持续更新。 2.生成的位图如何显示到画布上核心点最难点 首先明确一点freetype只是将字符做成位图的工具不涉及位图在画布显示相关的配置具体如何将位图显示到LCD(嵌入式称为画布) 利用c/c的话术来说就是将保存位图的缓存内容拷贝到画布的缓存上即可。但是不仅仅是简单的字符拷贝在拷贝的过程中还要考虑到LCD的像素格式RGB888RGB555等不同的像素格式单个像素所占的内存大小是不一样的就导致拷贝时的内存偏移是不同的下面代码进行跟明确的解释 //这里LCD的像素格式为ARGB8888,即一个像素占四个字节A透明度(8bit)R红色(8bit)G绿色(8bit)B:蓝色(8bit) void Manage::lcd_put_pixel(int x, int y, unsigned int pixel, unsigned int color) {/**Get_Canvas_Addr()画布的地址*(32 / 8):一个像素占多少字节*Get_Stride()垂直步长和像素格式有关假如画布的分辨率为1920*1080像素格式为ARGB8888则垂直步长为1920*4* 很好理解画布水平有1920个像素点每个像素点占四个字节*/unsigned char *pen_8 (Get_Canvas_Addr() x * (32 / 8) y * Get_Stride());//画布显示位置在画布缓存中的地址偏移unsigned int *pen_16;unsigned int red 0, green 0xff, blue 0;pen_16 (unsigned int *)pen_8;//pixel:代表像素点的值if (pixel ! 0){ //一个像素由RGB组成而像素格式占四个字节所以将unsigned char类型的缓存转换成unsigned int类型进行赋值代表整个像素点pixel color;}else{//没有像素点说明是空白区域以白色填充*pen_16 0x0000;}//将像素值拷贝到画布*pen_16 pixel; }如果对于画布的坐标偏移很难理解参考下下图 其中坐标点就是位图想要在画布上显示的坐标点颜色相同的四个方块代表一个像素点一个方块代表一个字节则坐标点在画布的缓存中的地址位置为y*(1920*4)x*4; 这样就很清楚明了了吧 这个模块就是将生成好的位图数据显示到LCD画布的过程在实际的项目开发中画布的坐标画布的分辨率画布的像素格式位图的坐标位图的各种参数都是非常重要的考虑项想要了解更多关注我后续持续更新 3.LCD坐标和笛卡尔坐标在实际项目中如何应用 lcd坐标就是LCD在做图像显示时的坐标以左上角为原点y轴与笛卡尔坐标相反向下为正x轴与笛卡尔坐标一样 笛卡尔坐标就是我们上学时学到坐标轴 为什么要说这两个坐标的因为如果坐标与freetype接口相关的话就会涉及到笛卡尔坐标因为freetype内部使用的时笛卡尔坐标需要与LCD坐标进行转换。 具体分析图如下 在进行位图渲染时freetype是按照红点为原点进行坐标设置的而LCD(画布)是按照绿色原点进行设置的因此如果坐标使用freetype进行设置那么y坐标要使用LCD的高减去想要的y值才是我们想要的坐标 如上图想要让位图显示在LCD(100,100)的坐标处但是使用freetype时y坐标就不能设置为100而要设置为h-100x都是一样的不用考虑x的转换。 有如下代码 //该代码是从实际项目中摘录删去了无用代码导致可能无法编译仅表示位图生成过程 int Manage::FreeType_Generate_Bitmap(uint32_t h, uint32_t w, std::string color) {FT_Library library;FT_Face face;FT_GlyphSlot slot;FT_Error error;unsigned int co 0;// 初始化 FreeType 库error FT_Init_FreeType(library);if (error){printf(Failed to initialize FreeType library\n);return 1;}// 加载字体文件error FT_New_Face(library, /mmc_data/msyh.ttf, 0, face);if (error FT_Err_Unknown_File_Format){printf(Unsupported font file format\n);return 1;}else if (error){printf(Failed to load font file\n);return 1;}slot face-glyph;FT_Select_Charmap(face, FT_ENCODING_UNICODE);// // 设置字体大小,后面两个参数是长宽如果其中一个为0则默认与另一个参数相同FT_Set_Pixel_Sizes(face, 0, 48);// 只使用灰度位图FT_Render_Mode render_mode FT_RENDER_MODE_NORMAL;// 设置字符串const char *text hello;// 计算字符串在画布的中间位置int string_width 0;int string_height 0;//计算将整个字符串转换为位图后位图的总长度和总高度for (int i 0; i strlen(text); i){FT_Load_Char(face, text[i], FT_LOAD_RENDER);// string_width face-glyph-bitmap.width;//计算总长度时要使用水平步长(face-glyph-advance.x),不要使用字符位图宽度(face-glyph-bitmap.width),因为位图是按照//水平步长或者垂直步长进行偏移的两者的区别请参考我的文章string_width (face-glyph-advance.x 6);if (face-glyph-bitmap.rows string_height){string_height face-glyph-bitmap.rows;}}// 逐字符渲染并绘制到位图//pen_x,pen_y就是我们想要设置的LCD坐标int pen_x (w - string_width) / 2;int pen_y string_height - slot-bitmap_top;FT_Vector pen;//使用freetype时要乘以64因为freetype内部是1/64像素pen.x pen_x * 64;pen.y pen_y * 64;printf(pen_x : %d, pen_y : %d, top : %d\n, pen_x, pen_y, slot-bitmap_top);co Get_Int_Color(color);for (int i 0; i strlen(text); i){//使用FT_Set_Transform接口将pen_x,pen_y转化为freetype坐标FT_Set_Transform(face, 0, pen);error FT_Load_Char(face, text[i], FT_LOAD_RENDER);if (error){printf(Failed to load glyph\n);continue;}//FT_Set_Transform转化之后x坐标为slot-bitmap_lefty坐标为slot-bitmap_topint x slot-bitmap_left; // 字形位图的左边界偏移int y h - slot-bitmap_top; // 字形位图的上边界偏移,这就是上面说到的坐标转换再将freetype笛卡尔坐标转换为LCD坐标FT_Int x_max x slot-bitmap.width;FT_Int y_max y slot-bitmap.rows;//下面就是将位图渲染到LCD的过程参考上面第二小节for (int i x, p 0; i x_max; i, p){for (int j y, q 0; j y_max; j, q){if (i 0 || j 0 || i w || j h)continue;lcd_put_pixel(i, j, slot-bitmap.buffer[q * slot-bitmap.width p], co);}}pen.x slot-advance.x;// pen.y slot-advance.y;}// 释放资源FT_Done_Face(face);FT_Done_FreeType(library);return 0; } 当然如果你觉得坐标的相互转换很迷惑我这有一种方可可以只考虑LCD坐标不考虑笛卡尔坐标也就是坐标不经过freetype具体方法关注我后期会出一篇详解freetype及使用技巧的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西乡县门户网站宁波市网站排名优化

先贴上关于使用这个日志组件的一些使用方法,等有时间了在吧官方的文档翻译一下吧,现在真是没时间。 Serilog在使用上主要分为两大块: 第一块是主库,包括Serilog以及Serilog.AspNetCore,如果导入后一个的话会自动导入前…

国内虚拟助手网站国外打开网站会不会乱码

参考资料:https://blog.51cto.com/u_11984354/4907646 NO.21-SAP S4 HANA Cloud API接口测试(1)-CSDN博客

dede网站名称不能保存网站开发与建设方向

前面学习了一个简单的例子,这是多年来学习应用程序开发的经典路径,在这里也是这种待遇,通过这样的学习明白了一个简单应用是怎么样构成的,知道它是怎么运行输出的。在这个基础之上,你还是不会开发应用程序的,因为你还没有学习鸿蒙应用的开发语言基础,所以在这里要学习一…

抚顺市 网站建设中国移动积分兑换商城官方网站

资料仅供学习分享用,废话不多说,解压密码为:1024文件是切割压缩的,多个part的压缩包,大家需要先下载到本地在解压,直接百度云解压会提示压缩包损坏。------------------------------学习资料java&#xff1…

免费一键自助建站官网软件开发5个过程

什么是HTTP压缩cssHTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法,好比gzip来压缩HTML,Javascript, CSS文件。 能大大减小网络传输的数据量,提升了用户显示网页的速度。固然,同时会增长一点点服…

建网站申请济南营销型网站制作

-----2017.11.16 最后一次更新----- 小夕也真的没有想到,在万般绝望之时竟然得到了这么多人的帮助。在本文发出后,多位阿里人员积极联系我了解了情况,很感激一位阿里的专家帮我将此事递交给相关部门,让专业的客服直接受理和重审此…

防制网站怎么做wordpress主页视频

作者: 陈斌(redguardtoo) 更新时间: 2012-02-10 五 原创时间: 2012-01-31 周二 15:08 很容易.一年多前我还在Vi阵营,偶尔使用Emacs还总是忘记退出(C-x C-c)的快捷键,但是一年后我跨入高手行列. 现在网上很多中文文章都是和你强调Emacs有多牛,以激发你的兴趣.最有名的大概是王垠…

中山企业网站建设定制现在都用什么做网站

NaN 是什么 在C中,NaN(Not a Number)是一种特殊的浮点数值,用于表示无法表示的数值或未定义的操作,例如0除以0。如果你的double类型变量显示为NaN,那么可能是在计算过程中出现了这种未定义的操作。 如果你…

如何将别人的网站作为自己的网站报错401

源码简介 超级外链工具,是一款在线全自动化发外链的推广工具。使用本工具可免费为网站在线批量增加外链,大大提高外链发布工作效率,是广大草根站长们必备的站长工具。 搭建环境 PHP 5.6 安装教程 上传源码压缩包到网站目录并解压即可 首…

广州网站优化关键词排名今天广西新闻回放

Atitit。数据库 安全性 重要敏感数据加密存储解决方案 1.1. 加密存储的重要性1 1.2. 使用的加密算法aes1 1.3. 数据加密以后会有一些问题。1 1.3.1. 一个是统计,比如统计资金总额。。就无法直接使用sql的sum等数据库内部聚合函数来处理了。。1 1.3.2. 还有一个就是按…

网站开发项目付款方式如何创建网站快捷方式到桌面

什么是卫语句在方法的开头,我们经常会添加一些检查代码,当检查条件为true时立刻从方法中返回。这样的单独检查代码被称为“卫语句”。例如,我们在添加用户时会检查用户名不能为空,年龄必须大于0:public void AddUser(s…

高端网站制作开发网页应用开发

SDN火热了好一阵子,无论运营商、政府企业、投资机构,一段时间,不知道SDN、不能甩几个SDN相关的名词术语,似乎都落后于时代了。今天,就来看看关于SDN的精华问答吧。1Q:SDN将会提供端到端的IT基础设施可见性&…

鹰手营子矿网站建设qq在线登录聊天

使用w查看系统负载1.w命令,查看系统负载:单位时间内使用cpu的活动的进程有多少个[rootweix01 ~]# w #load average 后面三个数字表示1分钟,5分钟,15分钟的负载值,最合适的是逻辑cpu数量与1分钟负载一致21:10:21 up 8 m…

单页网站排名没有苏州建设工程信息网

最近一直在研究cas登录中心这一块的应用,分享一下记录的一些笔记和心得。后面会把cas-server端的配置和重构,另外还有这几天再搞nginxcas的https反向代理配置,以及cas的证书相关的知识分享出来。 Cas由两部分组成,Cas Server和Cas…

书店建设网站的能力一 网站建设的总体目标

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、遗传算法GA 遗传算法(Genetic Algorithm,GA)起源于对生物系统所进行的计算机模拟研究,是一种随机全局搜索…

网站建设中单页面汕头网络公司网站建设

简介 在前一篇文章中,我们讨论了Razor页面。今天我们来谈谈处理方法(Handlers)。我们知道可以将代码和模型放在 .cshtml 文件里面或与 .cshtml 匹配的 .cshtml.cs 文件中。Razor页面处理程序或处理方法将用户请求匹配到我们的方法&#xff1…

口碑好的网站建设无为县城乡建设局网站

Vue常用经典开源项目汇总参考-海量 Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常…

广西建设学院官方网站德州网站建设

最近在复习C的一些相关知识,正好把智能指针重新梳理一遍。 智能指针 作用 为什么需要智能指针?说白了就是为了更加“方便智能”的管理内存,当使用原始指针有时候会因为忘记释放内存,从而导致内存泄漏 。智能指针则可以帮我们释放…

全国部分高校精品课程建设网站小微企业查询系统官网入口

需求 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#…

北京网站模板辽宁省建设银行招聘网站

1. shell中的运算1.1 数学比较运算-eq 等于-ne 不等于-lt 小于-gt 大于-le 小于等于-ge 大于等于浮点数的比较建议将数字等比放大至整数进行比较,例如#比较1.5和2的大小test echo 1.5*10|bc|awk -F "." {print $1} -lt $((2*10))1.2 文件比较运算-d 检查目…