怎么交叉编译 freetype + SDL2 + SDL2_ttf 参见我的上篇博客
freetype版本:freetype-2.10.0.tar.bz2
SDL2版本:SDL2-2.30.9
SDL2_ttf版本:SDL2_ttf-2.0.15
代码下载链接:
通过网盘分享的文件:3516cv610上实现 osd_string
链接: https://pan.baidu.com/s/1ZBdTywABSBPcfvOnZVEp-w 提取码: cywx
--来自百度网盘超级会员v4的分享
本篇文件借鉴于:
【海思】图像视频OSD准备——移植freetype、SDL、SDL_ttf到开发板_freetype 绘制 osd 图片-CSDN博客
编译:
SDL.h
SDL_ttf.h
这两个对应的头文件,改成自己的路径
编译时可能会遇到
SDL_PixelFormat没有 colorkey、alpha这两个成员变量报错,这里我屏蔽掉,编译的
#include
#include
#include
#include "./install/include/SDL2/SDL.h"
//#include "SDL.h"
//#include "SDL_ttf.h"
#include "./install/include/SDL2/SDL_ttf.h"
#include "time.h" // 此文件 c库自带的文件
#define FONT_PATH "/mnt/FontAwesome.ttf"
//#define FONT_PATH "./UbuntuMono-BI.ttf"
int string_to_bmp(char *pu8Str);
int cnt = 0;
int main()
{
time_t now;
struct tm *ptm;
char timestr[100] = {0};
while(1)
{
usleep(1000000);
time(&now);
ptm = localtime(&now);
snprintf(timestr,100,"时间%d-%02d-%02d %02d:%02d:%02d",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
string_to_bmp(timestr);
memset(timestr,0,100);
if(cnt++ > 5)
{
break;
}
}
return 0;
}
int string_to_bmp(char *pu8Str)
{
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(FONT_PATH, 80);
if ( font == NULL )
{
fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",18,"ptsize", SDL_GetError());
}
SDL_Color forecol = { 0xff, 0xff, 0xff, 0xff };
text = TTF_RenderUTF8_Solid(font, pu8Str, 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);
char savename[10] = {0};
snprintf(savename,10,"%d.bmp",cnt);
printf("savename = %s\n",savename);
SDL_SaveBMP(temp, savename);
SDL_FreeSurface(text);
SDL_FreeSurface(temp);
TTF_CloseFont(font);
TTF_Quit();
return 0;
}
交叉编译命令为
arm-v01c02-linux-musleabi-gcc test.c -I./include/SDL -L./install/lib -lSDL2 -lfreetype -lSDL2_ttf -lpthread
可以看出使用了动态链接库,故将编译好的可执行文件复制到开发板后,还需要复制所需的so库文件到开发板的/lib目录下。可以先运行以下,缺哪个库就复制哪个库,都在之前交叉编译的SDL、SDL_ttf的lib目录下。
程序运行结果如下
运行完后看一下运行目录,已经生成了0~6张位图
bmp图效果
可能我屏蔽掉,这两个成员变量 引起的,图片没有显示出时间。去查 SDL_PixelFormat结构体相关信息,确实没有 colorkey alpha这两个成员变量
SDL_PixelFormat *fmt;
// fmt->colorkey = 0xffffffff;
// fmt->alpha = 0xff;
typedef struct SDL_PixelFormat
{
Uint32 format;
SDL_Palette *palette;
Uint8 BitsPerPixel;
Uint8 BytesPerPixel;
Uint8 padding[2];
Uint32 Rmask;
Uint32 Gmask;
Uint32 Bmask;
Uint32 Amask;
Uint8 Rloss;
Uint8 Gloss;
Uint8 Bloss;
Uint8 Aloss;
Uint8 Rshift;
Uint8 Gshift;
Uint8 Bshift;
Uint8 Ashift;
int refcount;
struct SDL_PixelFormat *next;
} SDL_PixelFormat;
typedef struct SDL_Palette
{
int ncolors;
SDL_Color *colors;
Uint32 version;
int refcount;
} SDL_Palette;
typedef struct SDL_Color
{
Uint8 r;
Uint8 g;
Uint8 b;
Uint8 a;
} SDL_Color;