利用SDL_TTF库渲染文字并保存
目录
上面是这个程序运行的效果,保存了一张bmp的位图。这个位图就是2024-12-18 11:38的字符串。
一.SDL_TTF库渲染文字的流程

上面是SDL_TTF输出文字图层的几个重点步骤,分别是ttf_init初始化、TTF_OpenFont打开字符库、TTF_RenderUTF8_Solid渲染字体、填充SDL_PixelFormat信息、SDL_ConvertSurface进行像素转换
1.1TTF_Init初始化TTF的全局环境
它的作用是初始化TTF的库,是做SDL_TTF渲染的第一步
1.2 TTF_OpenFont打开字符库
它的作用是打开字体库,同时设置字体的大小,我们来看看它的传参
TTF_Font * SDLCALL TTF_OpenFont(const char *file, int ptsize);
第一个参数:需要加载的字符库的名称,我们这里选择的是方正字库fzlth.ttf。
第二个参数:设置字体的大小,方正字库48效果最好。
1.3TTF_RenderUTF8_Solid
对输入的字符串进行渲染
SDL_Surface * SDLCALL TTF_RenderUTF8_Solid(TTF_Font *font, const char *text, SDL_Color fg);
第一个参数:TTF_Font结构体指针
第二个参数:需要渲染的字符串
第三个参数:字体颜色的设置,用SDL_Color进行设置,这个结构体分别是r、g、b三种颜色进行设置,这里的rgb都是用16进制表示。在本实例中我用三个0xff代表的是三个255,也就是字体是白色。
1.4 填充SDL_PixelFormat信息
SDL_PixelFormat主要是填充一些像素信息,其中重点设置的参数就上面那几个。
1.4.1. BitsPerPixel:SDL的每个像素位
1.4.2. BytesPerPixel:SDL的每个像素占的字节数
1.5 SDL_ConvertSurface
SDL_ConvertSurface对渲染的字体进行像素转换,转换成位图
SDL_Surface * SDLCALL SDL_ConvertSurface (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags);
第一个参数:SDL_Surface结构体指针
第二个参数:SDL_PixelFormat结构体指针
第三个参数:标识符,默认为0
二.实战代码
#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
// #include "common/sample_common.h"
#include "rkmedia_api.h"
#include <stdio.h>
#include "SDL.h"
#include "SDL_ttf.h"
#include <time.h>
int main()
{
char *pstr = "2024-12-18 11:38";
SDL_PixelFormat *fmt;
TTF_Font *font;
SDL_Surface *text, *temp;
//初始化SDL_TTF的全局参数
if (TTF_Init() < 0)
{
fprintf(stderr, "Couldn't initialize TTF: %s\n", SDL_GetError());
SDL_Quit();
}
//使用了fzlth.ttf字库(方正字库),字体大小最合适设置为48
font = TTF_OpenFont("./fzlth.ttf", 48);
if (font == NULL)
{
fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", 48, "ptsize", SDL_GetError());
}
////字体颜色是黑色,0xff=255, 0xff=255,0xff=255,rgb={255,255,255}
SDL_Color forecol = {0xff, 0xff, 0xff, 0xff};
//SDL_Color forecol = {0x00, 0x00, 0x00, 0xff};
text = TTF_RenderUTF8_Solid(font, pstr, forecol); //对输入的字符串进行渲染
fmt = (SDL_PixelFormat *)malloc(sizeof(SDL_PixelFormat));
memset(fmt, 0, sizeof(SDL_PixelFormat));
fmt->BitsPerPixel = 16; //SDL的每个像素位
fmt->BytesPerPixel = 2; //SDL的每个像素占的字节数
temp = SDL_ConvertSurface(text, fmt, 0); //SDL_ConvertSurface对渲染的字体进行像素转换,转换成位图
SDL_SaveBMP(temp, "save.bmp");//保存位图
SDL_FreeSurface(text);
SDL_FreeSurface(temp);
TTF_CloseFont(font);
TTF_Quit();
return 0;
}
三运行结果
上面是这个程序运行的效果,保存了一张bmp的位图。这个位图就是2024-12-18 11:38的字符串。

四运行时报的错误
![]()
上面这个错误是缺少了libSDL_ttf-2.0.so.0的库,此时要把libSDL_ttf-2.0.so.0放在/usr/lib下面
![]()
上面这个错误是缺少了libSDL-1.2.so.0的库,此时要把libSDL-1.2.so.0放在/usr/lib下面
更多推荐

所有评论(0)