海思多媒体(MPP)开发——区域管理(REGION&OSD中文显示)

在学了在学了! 2020-08-04 20:15:40 2695

(一)字符编码介绍

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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区