海思多媒体(MPP)开发——区域管理(REGION&OSD中文显示)
(一)字符编码介绍
1.1 ASCII码
我们知道, 在计算机内部, 所有的信息最终都表示为一个二进制的字符串. 每一个二进制位(bit)有0和1两种状态, 因此八个二进制位就可以组合出 256种状态, 这被称为一个字节(byte). 也就是说, 一个字节一共可以用来表示256种不同的状态, 每一个状态对应一个符号, 就是256个符号, 从 0000000到11111111.
上个世纪60年代, 美国制定了一套字符编码, 对英语字符与二进制位之间的关系, 做了统一规定. 这被称为ASCII码, 一直沿用至今.
ASCII码一共规定了128个字符的编码, 比如空格"SPACE"是32(二进制00100000), 大写的字母A是65(二进制01000001). 这128个符号(包括32个不能打印出来的控制符号), 只占用了一个字节的后面7位, 最前面的1位统一规定为0.
1.2 非ASCII编码
英语用128个符号编码就够了, 但是用来表示其他语言, 128个符号是不够的. 比如, 在法语中, 字母上方有注音符号, 它就无法用ASCII码表示. 于是, 一些欧洲国家就决定, 利用字节中闲置的最高位编入新的符号. 比如, 法语中的é的编码为130(二进制10000010).这样一来, 这些欧洲国家使用的编码体系, 可以表示最多256个符号.
但是, 这里又出现了新的问题. 不同的国家有不同的字母, 因此, 哪怕它们都使用256个符号的编码方式, 代表的字母却不一样. 比如, 130在法语编码中代表了é, 在希伯来语编码中却代表了字母Gimel (ג), 在俄语编码中又会代表另一个符号.
NOTE:
但是不管怎样, 所有这些编码方式中, 0-127表示的符号是一样的, 不一样的只是128-255的这一段. // MMMMM
至于亚洲国家的文字, 使用的符号就更多了, 汉字就多达10万左右. 一个字节只能表示256种符号, 肯定是不够的, 就必须使用多个字节表达一个符号. 比如, 简体中文常见的编码方式是GB2312, 使用两个字节表示一个汉字, 所以理论上最多可以表示256x256=65536个符号.
上面内容参考自tge7618291的这篇博客https://blog.csdn.net/tge7618291/article/details/7599902 。
(二)编码转换
简体中文是GBK2312格式,要将简体字符显示出来,需要将GBK格式转换成Unicode格式,然后再将Unicode格式转换成utf-8格式,最后才能正常的显示出来。
转换GBK转Unicode:
unsigned short zz_gbk2uni(unsigned char ch, unsigned char cl)
{
ch -= 0x81;
cl -= 0x40;
return (ch<=0x7d && cl<=0xbe) ? mb_gb2uni_table[ch*0xbf+cl] : 0x1fff;
}
Unicode转UTF-8:
/*****************************************************************************
* 将一个字符的Unicode(UCS-2和UCS-4)编码转换成UTF-8编码.
*
* 参数:
* unic 字符的Unicode编码值
* pOutput 指向输出的用于存储UTF8编码值的缓冲区的指针
* outsize pOutput缓冲的大小
*
* 返回值:
* 返回转换后的字符的UTF8编码所占的字节数, 如果出错则返回 0 .
*
* 注意:
* 1. UTF8没有字节序问题, 但是Unicode有字节序要求;
* 字节序分为大端(Big Endian)和小端(Little Endian)两种;
* 在Intel处理器中采用小端法表示, 在此采用小端法表示. (低地址存低位)
* 2. 请保证 pOutput 缓冲区有最少有 6 字节的空间大小!
****************************************************************************/
int enc_unicode_to_utf8_one(unsigned long unic, unsigned char *pOutput,
int outSize)
{
if(pOutput == NULL)
return 0;
if(outSize < 6)
return 0;
if ( unic <= 0x0000007F )
{
// * U-00000000 - U-0000007F: 0xxxxxxx
*pOutput = (unic & 0x7F);
return 1;
}
else if ( unic >= 0x00000080 && unic <= 0x000007FF )
{
// * U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
*(pOutput+1) = (unic & 0x3F) | 0x80;
*pOutput = ((unic >> 6) & 0x1F) | 0xC0;
return 2;
}
else if ( unic >= 0x00000800 && unic <= 0x0000FFFF )
{
// * U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
*(pOutput+2) = (unic & 0x3F) | 0x80;
*(pOutput+1) = ((unic >> 6) & 0x3F) | 0x80;
*pOutput = ((unic >> 12) & 0x0F) | 0xE0;
return 3;
}
else if ( unic >= 0x00010000 && unic <= 0x001FFFFF )
{
// * U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
*(pOutput+3) = (unic & 0x3F) | 0x80;
*(pOutput+2) = ((unic >> 6) & 0x3F) | 0x80;
*(pOutput+1) = ((unic >> 12) & 0x3F) | 0x80;
*pOutput = ((unic >> 18) & 0x07) | 0xF0;
return 4;
}
else if ( unic >= 0x00200000 && unic <= 0x03FFFFFF )
{
// * U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
*(pOutput+4) = (unic & 0x3F) | 0x80;
*(pOutput+3) = ((unic >> 6) & 0x3F) | 0x80;
*(pOutput+2) = ((unic >> 12) & 0x3F) | 0x80;
*(pOutput+1) = ((unic >> 18) & 0x3F) | 0x80;
*pOutput = ((unic >> 24) & 0x03) | 0xF8;
return 5;
}
else if ( unic >= 0x04000000 && unic <= 0x7FFFFFFF )
{
// * U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
*(pOutput+5) = (unic & 0x3F) | 0x80;
*(pOutput+4) = ((unic >> 6) & 0x3F) | 0x80;
*(pOutput+3) = ((unic >> 12) & 0x3F) | 0x80;
*(pOutput+2) = ((unic >> 18) & 0x3F) | 0x80;
*(pOutput+1) = ((unic >> 24) & 0x3F) | 0x80;
*pOutput = ((unic >> 30) & 0x01) | 0xFC;
return 6;
}
return 0;
}
(三)生成中文图像
与上上一篇介绍的内容相似,只是一个中文占用两个字节,按两个字节处理一个中文字就可以正常显示了。
/************************************************************
*Copyright (C),lcb0281at163.com lcb0281atgmail.com
*BlogAddr: caibiao-lee.blog.csdn.net
*FileName: debug_font_osd.c
*Description:字符和文字生成图片
*Date: 2020-02-03
*Author: Caibiao Lee
*Version: V1.0
*Others:
*History:
***********************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "SDL/SDL.h"
#include "SDL/SDL_ttf.h"
#include "debug_font_osd.h"
#define CHINESET_STRING "阿标在学习中"
#define FONT_PATH "./font/hisi_osd.ttf"
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);
SDL_SaveBMP(temp, "save.bmp");
SDL_FreeSurface(text);
SDL_FreeSurface(temp);
TTF_CloseFont(font);
TTF_Quit();
return 0;
}
int CreateTimeBmpPicture(void)
{
time_t l_stTime;
struct tm l_stTm;
struct tm *l_pstTm=&l_stTm;
char s8Contenx[128]={0};
time(&l_stTime);
localtime_r(&l_stTime,l_pstTm);
snprintf(s8Contenx,sizeof(s8Contenx), "20%02d-%02d-%02d-%02d:%02d:%02d",\
(l_pstTm->tm_year-100), (1+l_pstTm->tm_mon), l_pstTm->tm_mday,\
l_pstTm->tm_hour, l_pstTm->tm_min, l_pstTm->tm_sec);
printf("string: %s \n",s8Contenx);
string_to_bmp(s8Contenx);
}
int CreateChinesePicture(void)
{
int i = 0;
char l_s32Len = 0;
char l_arrs8Str[64] = {0};
char l_arrs8UTFBuf[64] = {0};
char l_arrss8Contenx[64] = {0};
unsigned short usUnicode=0;
unsigned int usUtfLen=0;
unsigned int u32ContenxOffest=0;
snprintf(l_arrs8Str,sizeof(l_arrs8Str),"%s",CHINESET_STRING);
l_s32Len = strlen(l_arrs8Str);
printf(" len = %d \n",l_s32Len);
for(i=0;i<l_s32Len;)
{
usUnicode=zz_gbk2uni((unsigned char)l_arrs8Str[i++],(unsigned char)l_arrs8Str[i++]);
usUtfLen= enc_unicode_to_utf8_one(usUnicode,l_arrs8UTFBuf,64);
if(usUtfLen<0)
{
printf("%s %d out len error \n",__FUNCTION__,__LINE__);
break;
};
memcpy(&l_arrss8Contenx[u32ContenxOffest],l_arrs8UTFBuf,usUtfLen);
u32ContenxOffest+=usUtfLen;
}
string_to_bmp(l_arrss8Contenx);
return 0;
}
int main(void)
{
printf("hello world \n");
//CreateTimeBmpPicture();
CreateChinesePicture();
return 0;
}
工程文件结构:
biao@ubuntu:~/nfs/OSD/font$ tree -L 2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
├── bin
│ └── objs
├── debug_font_osd.c
├── debug_font_osd.h
├── font
│ ├── hisi_osd.ttf
│ └── hisi_osd.ttf_df
├── GBK_To_Unicode.c
├── GBK_To_Unicode.h
├── inc
│ ├── freetype2
│ ├── ft2build.h
│ └── SDL
├── lib
│ ├── libfreetype.a
│ ├── libfreetype.so
│ ├── libfreetype.so.6
│ ├── libSDL-1.2.so.0
│ ├── libSDL.a
│ ├── libSDLmain.a
│ ├── libSDL.so
│ ├── libSDL_ttf-2.0.so.0
│ ├── libSDL_ttf.a
│ ├── libSDL_ttf.so
│ └── pkgconfig
├── Makefile
├── save.bmp
└── test
8 directories, 20 files
biao@ubuntu:~/nfs/OSD/font$
生成的图片显示为:
如果需要将中文字符添加视频流中去,可以参考上一篇博客的内容。
第一个生成时间图像的工程可以从下面获取:
GitHub: freetype_SDL_Dl_ttf_debug
CSDN : freetype_SDL_Dl_ttf_debug.tar.gz
原文链接:https://blog.csdn.net/li_wen01/article/details/105025120
- 分享
- 举报

-
浏览量:3481次2020-08-03 11:10:18
-
浏览量:5514次2020-07-31 11:54:44
-
浏览量:2908次2020-08-04 20:08:51
-
浏览量:5147次2020-07-31 11:03:23
-
浏览量:1905次2023-11-07 15:38:56
-
浏览量:3632次2020-07-30 11:57:30
-
浏览量:5991次2020-08-03 18:36:13
-
浏览量:2215次2024-01-02 16:35:00
-
浏览量:1900次2024-01-25 16:21:59
-
2020-08-03 19:07:53
-
浏览量:4692次2020-07-31 13:45:09
-
浏览量:1245次2024-01-19 17:52:40
-
2020-08-03 19:14:56
-
浏览量:874次2022-12-26 08:56:18
-
浏览量:3760次2020-07-27 15:12:15
-
浏览量:3742次2020-08-05 20:36:22
-
浏览量:973次2024-01-11 15:05:58
-
浏览量:4011次2020-07-17 16:50:14
-
浏览量:1758次2024-03-05 17:10:43
-
104篇
- Hi3516CV610 超高清智慧视觉SoC
- 中国商务部《不可靠实体清单规定》发布,不针对特定国家及实体
- 海思芯片Hi3519DV500的应用:打造高性能图像处理解决方案
- 海思 | 8K入户带动信息与智能产业集群升级
- (调试记录)海思sensor断流问题及调试方法(IMX335,IMX327)
- 南京启诺信息技术有限公司荣获2024年度openEuler领先商业实践创新荣誉,海鸥派引领高校人才培训与就业新篇章!
- 使用libjpeg将yuv数据转换为内存中的jpg
- 组装电脑重新安装win8系统后只有一个盘了别的分区的资料咋寻回
- Hi3518EV200实现H264视频采集的源码及流程详解(不依赖SAMPLE库)
- 战疫|加入复工者联盟的第N天…
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖

在学了在学了!






举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明