基于已交叉编译好 freetype + SDL2 + SDL2_ttf,在hi3516cv610上生成位图

怎么交叉编译 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目录下。
程序运行结果如下

基于已交叉编译好 freetype + SDL2 + SDL2_ttf,在hi3516cv610上生成位图_第1张图片

运行完后看一下运行目录,已经生成了0~6张位图

基于已交叉编译好 freetype + SDL2 + SDL2_ttf,在hi3516cv610上生成位图_第2张图片

bmp图效果

基于已交叉编译好 freetype + SDL2 + SDL2_ttf,在hi3516cv610上生成位图_第3张图片

基于已交叉编译好 freetype + SDL2 + SDL2_ttf,在hi3516cv610上生成位图_第4张图片

可能我屏蔽掉,这两个成员变量 引起的,图片没有显示出时间。去查 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;

你可能感兴趣的:(ffmpeg)