linux图像显示

linux图像显示(一)framebuffer操作

linux图像显示(二)bmp图片

linux图像显示(三)使用libjpg处理jpg图片

linux图像显示(四)使用libpng处理png图片

linux图像显示(五)使用freetype处理矢量字体

FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。

下面讲解怎么使用freetype,包括freetype的移植,freetype的使用实例

库和示例代码:https://download.csdn.net/download/weixin_42462202/10855217

1、移植库

(1)在ubuntu下解压,进入源码目录

(2)配置

①先指定编译工具链

env CC=arm-linux-gcc

②指定运行平台和库安装目录,这里我的安装目录是/opt/mlib

./configure --host=arm-linux --prefix=/opt/mlib

③编译安装

make
make install

现在在/opt/mlib目录下就生成了头文件和库

2、freetype的使用

(1)在项目中使用库

库现在已经在/opt/lib目录下,怎么使用呢?

答:通过-I -L -l 给编译器 指定头文件路径和库

-I :指定头文件路径

-L :指定库路径

-l :指定库

为了方便,写一个简单的Makefile

CFLAGS += -I/opt/mlib/include/ -I/opt/mlib/include/freetype2/ -I/opt/mlib/include/freetype2/freetype/ -I/opt/mlib/include/freetype2/freetype/config/LDFLAGS += -L/opt/mlib/lib/
LDFLAGS += -lfreetype -lmall:arm-linux-gcc examplet.c -o example $(LDFLAGS) $(CFLAGS)

(2)freetype使用步骤说明

①初始化库

 FT_EXPORT( FT_Error )FT_Init_FreeType( FT_Library  *alibrary );

②创建face 对象来打开字体文件

 FT_EXPORT( FT_Error ) FT_New_Face( FT_Library   library,const char*  filepathname,FT_Long      face_index,FT_Face     *aface );

③选择字符的大小

 pixel_width:字体的像素宽度pixel_height:字体的像素高度FT_EXPORT( FT_Error )FT_Set_Pixel_Sizes( FT_Face  face,FT_UInt  pixel_width,FT_UInt  pixel_height );

④添加渲染(可选,斜体、加粗、下划线等)

  FT_EXPORT( void )FT_Set_Transform( FT_Face     face,FT_Matrix*  matrix,FT_Vector*  delta );

⑤转化bitmap位图

  FT_EXPORT( FT_Error )FT_Load_Char( FT_Face   face,FT_ULong  char_code,FT_Int32  load_flags );

⑥开始绘制

void
draw_bitmap( FT_Bitmap*  bitmap,FT_Int      x,FT_Int      y)

(3)freetype使用示例

①在控制台显示

#define WIDTH   640
#define HEIGHT  480unsigned char image[HEIGHT][WIDTH];int main(int argc, char **argv)
{FT_Library    library;FT_Face       face;FT_GlyphSlot  slot;FT_Matrix     matrix;                 /* transformation matrix */FT_Vector     pen;                    /* untransformed origin  */FT_Error      error;char*         filename;char*         text;double        angle;int           target_height;int           n, num_chars;if ( argc != 3 ){fprintf ( stderr, "usage: %s font sample-text\n", argv[0] );exit( 1 );}        filename      = argv[1]; /* 获取字体格式文件 */text          = argv[2]; /* 获取显示内容 */angle         = ( 25.0 / 360 ) * 3.14159 * 2; /* 字体旋转角度 */target_height = HEIGHT; /* 得到屏幕的高度 *//* 1.初始化库 */error = FT_Init_FreeType( &library );/* 2.创建一个新的 face 对象来打开一个字体文件 */error = FT_New_Face( library, argv[1], 0, &face );/* 3.选择一个字符大小 */error = FT_Set_Pixel_Sizes(face, 24, 0);/* 字体旋转 */angle         = (25 / 360 ) * 3.14159 * 2; /* 旋转25度 */matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );/* 图像绘制起点 */pen.x = (g_var.xres / 2 + 8 + 16) * 64;pen.y = (g_var.yres / 2 +8 + 16 - 35) * 64;for ( n = 0; n < num_chars; n++ ){/* 4.渲染字体 */FT_Set_Transform( face, &matrix, &pen );/* 5.转化bitmap位图 */error = FT_Load_Char(face, text[n], FT_LOAD_RENDER); /* 6.开始绘制 */draw_bitmap( &slot->bitmap,slot->bitmap_left,target_height - slot->bitmap_top );pen.x += slot->advance.x;pen.y += slot->advance.y;show_image(); }FT_Done_Face    ( face );FT_Done_FreeType( library );
}void
draw_bitmap( FT_Bitmap*  bitmap,FT_Int      x,FT_Int      y)
{FT_Int  i, j, p, q;FT_Int  x_max = x + bitmap->width;FT_Int  y_max = y + bitmap->rows;for ( i = x, p = 0; i < x_max; i++, p++ ){for ( j = y, q = 0; j < y_max; j++, q++ ){if ( i < 0      || j < 0       ||i >= WIDTH || j >= HEIGHT )continue;image[j][i] |= bitmap->buffer[q * bitmap->width + p];}}
}void
show_image( void )
{int  i, j;for ( i = 0; i < HEIGHT; i++ ){for ( j = 0; j < WIDTH; j++ )putchar( image[i][j] == 0 ? ' ': image[i][j] < 128 ? '+': '*' );putchar( '\n' );}
}

测试方法:

第一个参数是字体格式文件
第二参数是你要显示的文字./example simsun.ttc abc

②在lcd上显示

在lcd上显示只需要修改这个函数

void draw_bitmap( FT_Bitmap*  bitmap, FT_Int x, FT_Int y)
{FT_Int  i, j, p, q;FT_Int  x_max = x + bitmap->width;FT_Int  y_max = y + bitmap->rows;for ( i = x, p = 0; i < x_max; i++, p++ ){for ( j = y, q = 0; j < y_max; j++, q++ ){if ( i < 0      || j < 0       ||i >= g_var.xres || j >= g_var.xres )continue;/* 将这句话改为在lcd的指定位置打点 *///image[j][i] |= bitmap->buffer[q * bitmap->width + p];lcd_put_pixel(i, j, bitmap->buffer[q * bitmap->width + p]);}}
}

③显示中文

可以通过改变FT_Load_Char( face, text[n], FT_LOAD_RENDER );的传参来显示中文

wchar_t *chinese_str = L哈哈哈g";error = FT_Load_Char(face, chinese_str[n], FT_LOAD_RENDER);

在linux环境下wchar_t表示一个字符4个字节

可以使用wcslen(chinese_str);获取wchar_t类型字符串的字符个数

linux图像显示(五)使用freetype处理矢量字体相关推荐

  1. Linux电子书项目之freetype实现矢量字体的显示(2)

    上一篇博文我们通过点阵数组实现了字母的显示:http://blog.csdn.net/shenhuan1104/article/details/79476053 现在我们通过freetype这个框架在 ...

  2. 使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果

    使用FreeType实现矢量字体的粗体.斜体.描边.阴影效果 原文 http://www.cppblog.com/mybios/archive/2009/08/01/91869.html 使用Free ...

  3. FreeType解析矢量字体存在的问题以及优化技巧

    目录 一.前言 二.FreeType 存在的问题 三.针对 FreeType 存在问题的优化技巧 3.1 提高 FreeType 解析字体的精度 3.2 关闭 auto\_hint 四.总结 一.前言 ...

  4. RV1126笔记三十:freetype显示矢量字体

    若该文为原创文章,转载请注明原文出处. 在前面介绍了使用取模软件,可以自定义OSD,这种做法相对不灵活,也无法变更,适用大部分场景. 如果使用opencv需要移植opencv,芯片资源相对要相比好,而 ...

  5. freetype 使用解析---矢量字体

    屏幕显示字体(字体点阵): 在内核中有对应的文件fontdata_8x16.c,将字体通过数组8*16来描述,0表示为空,1表示描点,通过通过各个点形成一个字体点阵显示在屏幕上,而在我们所有终端中显示 ...

  6. 基于嵌入式linux的freetype矢量字体简单显示的实现

    一.freetype简介 FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,可以非常方便我们开发字体显示相关的程序功能.它支持单色位图.反 ...

  7. 数码相框(四、使用freetype库实现矢量字体显示)

    注:本人已购买韦东山第三期项目视频,内容来源<数码相框项目视频>.数码相框-通过freetype库实现矢量显示,只用于学习记录,如有侵权,请联系删除.     在数码相框(三.LCD显示文 ...

  8. FreeType矢量字体对颜色的显示(妙用)

    在网上发现FreeType矢量字体对颜色的显示这类文章较少,这里就给出一个示例代码: show_lines.c #include <sys/mman.h> #include <sys ...

  9. WindML、FreeType和TrueType三者相结合实现矢量字体的显示

    1 VxWorks5.5点阵字库的局限性 VxWorks5.5 是美国风河公司开发的嵌入式操作系统,图形系统采用WindML3.0,支持点阵字显示,不支持矢量字体显示.点阵字采用内存模式加载,使用前需 ...

最新文章

  1. 听说「面向对象是怎样工作的?」是一道送命题?| 7月书讯
  2. 如何通过session控制单点登录
  3. 家的味道,家的感觉!!!
  4. 什么方式可以通过影子系统传播恶意代码_将恶意代码隐藏在图像中:揭秘恶意软件使用的隐写术...
  5. oracle表参数,Oracle 表的创建 及相关参数
  6. 江西小学计算机说课稿,2019江西教师招聘面试-小学数学-说课稿
  7. python 归纳 (二二)_多进程数据共享和同步_管道Pipe
  8. 福利 | 干大事,成大事,2018 幸福如是!
  9. ROUTE ADD 命令详解
  10. MYSQL主从不同步延迟原理分析及解决方案
  11. ElasticSearch 核心概念
  12. cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wwma2wne\opencv\module
  13. 【前端性能优化】雅虎35条军规
  14. Win7下用的XP虚拟机
  15. 软件质量-知识点整理
  16. 怎么锻炼java逻辑思维_托马斯逻辑训练板技高一筹,锻炼编程逻辑思维能力
  17. 守望先锋地图工坊分享合集
  18. linux 微信不能发图片,微信回应发原图泄露位置信息​;元旦起 AI 造假音视频不得随意发布...
  19. NAT功能介绍及配置应用
  20. 哪里​可以​找到​SPICE​仿真​模型(转)

热门文章

  1. VLC Plugin JS 方法
  2. 【图解】什么是拥塞控制,这应该是把拥塞控制讲的最好的文章了
  3. 新手如何看k线(图)
  4. 微信小程序申请+开发+发布流程
  5. POI Word单元格合并
  6. Failed to connect to github.com port 443: Timed out 及 ping github.com请求超时
  7. STC仿真芯片原理探讨
  8. 14福师计算机导论在线作业一,(随机)福师18秋《计算机导论》在线作业一资料...
  9. 使用ADB命令卸载软件
  10. Docker Jenkins测试邮箱通知报错:553 Mail from must equal authorized user