Android的Recovery中font_10x18.h字库文件制作

本文深入解析了Android Recovery 汉化的全过程,包括英文字库的来源、转换过程、以及如何利用开源资源进行汉化。通过详细的操作步骤和实例,读者能够掌握从字体库创建、图片导出、格式转换到最终集成到Android Recovery中的完整流程。同时,文章还提供了多个相关链接,方便读者进一步深入学习和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          任务是要汉化Android中的Recovery,就了解了bootable/recovery/minui/font_10x18.h这个英文字库的来历,最终汉化的时候并没有自己汉字字库,用的github上现成的,但font_10x18.h来历短暂的留存在脑子里边不如记下来,这样会有好处,比如要更改字体风格、更改字体大小、如果要求实现其它非英语语言,都会重新来研究这个!

先预览一下font_10x18.h:

struct {
  unsigned width;
  unsigned height;
  unsigned cwidth;
  unsigned cheight;
  unsigned char rundata[];
} font = {
  .width = 960,
  .height = 18,
  .cwidth = 10,
  .cheight = 18,
  .rundata = {
0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x55,0x82,0x06,0x82,0x02,0x82,0x10,0x82,
...........................................................................
0x84,0x3f,
0x00,
  }
};

文件中有几点:
① font 的结果体类型来历
② font 中各个元素值由谁决定的
一点一点来找答案!


一、
打开BMFont后,右边的列表是我的字体库,各种不同的字体。选中第一项"Latin+Latin Supplement".
①Options->Font Setting:


图中Size对应结构体中cwidth; 图中Height %对应结构体中cheigh占height的百分比。
②Options->Export Options:

图中Width对应结构体中width;图中Height对应结构体中height;
③Options->save bitmap font as..


然后输入导出的文件名tmp,文件类型默认选.fnt,然后就会发现导出路径多了一个tmp_0.png的文件,那就是字库图片资源。需要的是这个png文件。fnt文件并不是我们需要的!
二、
有了tmp_0.png是成功的一半,下面要用到ps的linux版本gimp。
①打开gimp,文件->打开 来打开tmp_0.png
②文件->导出 输出名字填tmp.c
③在弹出的"图像导出C源码"配置对话框做如下配置:

tmp.c到font.c就差一步了
三、
取出android源码中的mkfont.c(bootable/recovery/minui/),然后和tmp.c一起编译:
一起编译最好的方法是将tmp.c换成头文件tmp.h 然后mkfont.c中添加该头文件!然后gcc mkfon.c
./a.out > font.h
此时打开font.h就会font_10x18.h并无大的差别了。唯一的差别是rundata这个元素,这个是选用的不同字体会生成不同的内容。

综上所述,可以总结流程图:




1.《Android Recovery汉化》

      - http://img.zqr.cm/thread-61-1-1.html

2.《联想A298T专用recovery中文恢复系统》

      - http://bbs.anzhi.com/thread-8076669-1-1.html

3.《在andriod中加入充电指示》

      - http://blog.csdn.net/shuaiff/article/details/5581127

4.《Android 的GUI 系统》

      - http://www.cnblogs.com/Caiqinghua/archive/2010/08/03/1790900.html 

5.《charger代码分析(Android4.2)》

      - http://blog.csdn.net/u010223349/article/details/8822747

6.《android 电池(二):android关机充电流程、充电画面显示》

      - http://blog.csdn.net/xubin341719/article/details/8498580

7.《recovery汉化实现》 

      - http://blog.csdn.net/haomcu/article/details/8189760

8.《linux下gimp将图片另存为.c格式文本文件-之后加工存储 》 

      - http://blog.chinaunix.net/uid-20564848-id-73227.html

9.《Android系统Recovery工作原理之使用update.zip升级过程分析》 

      - http://blog.csdn.net/mu0206mu/article/category/1059752

10.《Cocos2d-x初入学堂(6)-->Bitmap Font generator位图字体工具》 

      - http://blog.csdn.net/aa4790139/article/details/8113197

11.《android 关机闹钟》 

      - http://blog.csdn.net/g_salamander/article/details/8487328

12.《Android recovery模式》 

      - http://www.2cto.com/kf/201206/137579.html

13.《android recovery模式及ROM制作》

      - http://www.cnblogs.com/xl19862005/archive/2012/03/23/2414109.html

<think>我们遇到了新的编译错误:多个文件都报告无法打开源输入文件"tft_fonts.h"。这个错误表明编译器在包含路径中找不到`tft_fonts.h`文件。###解决方案:1.**创建`tft_fonts.h`文件**:我们需要创建一个名为`tft_fonts.h`的头文件,并在其中定义字体结构以及声明字体数据。2.**将`tft_fonts.h`文件添加到项目中**:确保该文件位于正确的目录下(通常是项目的`Inc`目录),并且在编译器的包含路径中。3.**在`tft_gfx.h`中包含`tft_fonts.h`**:我们已经这样做了,所以只要文件存在并位于正确位置,问题就会解决。###步骤:####1.创建`tft_fonts.h`文件在项目的`Core/Inc`目录下创建`tft_fonts.h`文件,内容如下:```c#ifndef__TFT_FONTS_H#define__TFT_FONTS_H#include"stm32f1xx_hal.h"//定义字体结构typedefstruct{uint8_twidth;//字符宽度(像素)uint8_theight;//字符高度(像素)constuint16_t*data;//指向字体数据的指针}FontDef;//声明外部字体externFontDefFont_8x16;externFontDefFont_12x24;externFontDefFont_16x32;//如果需要,还可以声明其他字体#endif/*__TFT_FONTS_H*/```####2.创建字体数据文件`tft_fonts.c`在项目的`Core/Src`目录下创建`tft_fonts.c`文件,并添加一些字体数据。这里我们以8x16字体为例:```c#include"tft_fonts.h"//8x16ASCII字体的数据(只包含部分字符,例如从空格到'~')constuint16_tFont8x16_Data[]={//每个字符16个像素高,用16位表示一行(但实际只有8位有效,所以我们用16位中的低8位)//空格(ASCII32)0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,//字符'!'(ASCII33)0x0000,0x0000,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x0000,0x0000,0x1800,0x1800,0x0000,0x0000,//...其他字符数据//注意:这里只示例两个字符,实际项目中需要完整的字符集};//定义字体结构实例FontDefFont_8x16={.width=8,.height=16,.data=Font8x16_Data};//同样,可以定义其他字体,如12x24和16x32//这里为了简洁省略,实际项目需要提供数据FontDefFont_12x24={.width=12,.height=24,.data=NULL//实际应指向具体数据};FontDefFont_16x32={.width=16,.height=32,.data=NULL//实际应指向具体数据};```####3.将`tft_fonts.c`添加到Keil项目中-在Keil的Project视图中,右键单击`Src`文件夹(或相应的组),选择`AddExistingFilestoGroup...`,然后添加`tft_fonts.c`。####4.确保包含路径正确-在Keil的项目选项中,确保`Core/Inc`目录在包含路径中。通常,如果使用默认的STM32CubeIDE或Keil项目结构,这个路径已经包含。如果没有,需要手动添加:-打开项目选项(OptionsforTarget)-转到`C/C++`选项卡-在`IncludePaths`中添加`Core/Inc`目录(或者你的头文件所在目录)####5.重新编译项目完成以上步骤后,重新编译项目,错误应该消失。###注意事项:1.**字体数据**:上面的示例中,我们只提供了两个字符的数据(空格和'!'),实际项目中需要完整的ASCII字符集(通常从32到126)。你可以使用字体生成工具(如`DotFactory`)来生成所需的字体数组。2.**字体数组的存储**:字体数组通常比较大,如果使用多种字体,可能会占用大量Flash空间。因此,在资源受限的MCU上,应谨慎选择字体。3.**字体数据的格式**:在示例中,我们假设每个像素用1位表示(0表示背景,1表示前景)。但在我们的结构体中,我们使用`uint16_t`数组,这是因为我们计划在TFT上使用RGB565颜色。实际上,字体数据通常以位图形式存储,每个像素用1位表示,然后在使用时根据前景色和背景色进行转换。因此,在`TFT_DrawChar`函数中,我们需要对每个位进行判断,然后绘制相应颜色的像素。###补充:字体数据生成如果你需要完整的字体数据,可以使用在线工具或离线工具生成。例如,使用[这个在线工具](https://rop.nl/truetype2gfx/)可以生成位图字体数组。###如果问题仍然存在如果仍然出现找不到头文件的错误,请检查:-文件`tft_fonts.h`是否确实位于`Core/Inc`目录下(大小写敏感,尤其是在Linux环境下编译时)。-在项目选项中,包含路径是否正确设置了`Core/Inc`目录(或头文件所在目录)的路径。###结论通过创建缺失的`tft_fonts.h`和`tft_fonts.c`文件,并将它们添加到项目中,可以解决这个编译错误。同时,确保字体数据正确生成,以便在TFT屏幕上显示文本。§§相关问题§§:1.如何在STM32项目中管理多个字体资源以节省Flash空间?2.有哪些常用的工具可以生成嵌入式系统所需的位图字体数组?3.在TFT屏幕上显示文本时,如何优化渲染速度?4.如何实现文本的抗锯齿效果在低分辨率屏幕上?</think>### 解决编译错误:无法打开 "tft_fonts.h" 文件 这个错误表明编译器找不到 `tft_fonts.h` 头文件。以下是完整的解决方案,包括创建必要的字体文件和配置项目路径: #### 解决方案步骤 1. **创建 tft_fonts.h 文件** 2. **创建 tft_fonts.c 文件** 3. **更新项目配置** 4. **修改 tft_gfx.h 文件** #### 1. 创建 tft_fonts.h 文件 在项目的 `Core/Inc` 目录下创建 `tft_fonts.h` 文件: ```c #ifndef __TFT_FONTS_H #define __TFT_FONTS_H #include "stm32f1xx_hal.h" // 字体结构体定义 typedef struct { uint8_t width; // 字符宽度 uint8_t height; // 字符高度 const uint16_t *data; // 字体数据指针 } FontDef; // 常用字体声明 extern FontDef Font_7x10; extern FontDef Font_11x18; extern FontDef Font_16x26; // 字体数据声明 extern const uint16_t Font7x10_Data[]; extern const uint16_t Font11x18_Data[]; extern const uint16_t Font16x26_Data[]; // 字体大小枚举 typedef enum { FONT_SIZE_SMALL = 0, FONT_SIZE_MEDIUM, FONT_SIZE_LARGE } FontSize; // 获取字体函数 FontDef* TFT_GetFont(FontSize size); #endif /* __TFT_FONTS_H */ ``` #### 2. 创建 tft_fonts.c 文件 在项目的 `Core/Src` 目录下创建 `tft_fonts.c` 文件: ```c #include "tft_fonts.h" // 7x10 字体数据 (示例数据) const uint16_t Font7x10_Data[] = { // 空格 (ASCII 32) 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // '!' (ASCII 33) 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0000, 0x0400, 0x0000, 0x0000, // 更多字符数据... // 实际项目中需要完整的ASCII字符集 }; // 11x18 字体数据 (示例数据) const uint16_t Font11x18_Data[] = { // 空格 (ASCII 32) 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 'A' (ASCII 65) 0x0E00, 0x1F00, 0x1F00, 0x1F00, 0x1F00, 0x1F00, 0x3B80, 0x3180, 0x3180, 0x3180, 0x7FC0, 0x7FC0, 0x60C0, 0x60C0, 0x60C0, 0xF1E0, 0x0000, 0x0000, // 更多字符数据... }; // 16x26 字体数据 (示例数据) const uint16_t Font16x26_Data[] = { // 空格 (ASCII 32) 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // '0' (ASCII 48) 0x07E0, 0x0FF0, 0x1C38, 0x381C, 0x300C, 0x700E, 0x6006, 0x6006, 0x6006, 0x6006, 0x6006, 0x6006, 0x6006, 0x700E, 0x300C, 0x381C, 0x1C38, 0x0FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 更多字符数据... }; // 字体定义 FontDef Font_7x10 = { .width = 7, .height = 10, .data = Font7x10_Data }; FontDef Font_11x18 = { .width = 11, .height = 18, .data = Font11x18_Data }; FontDef Font_16x26 = { .width = 16, .height = 26, .data = Font16x26_Data }; // 获取字体函数 FontDef* TFT_GetFont(FontSize size) { switch(size) { case FONT_SIZE_SMALL: return &Font_7x10; case FONT_SIZE_MEDIUM: return &Font_11x18; case FONT_SIZE_LARGE: return &Font_16x26; default: return &Font_11x18; } } ``` #### 3. 更新项目配置 在Keil项目中添加新文件: 1. 右键点击项目中的 "Core/Src" 文件夹 → 选择 "Add Existing Files to Group..." 2. 添加 `tft_fonts.c` 文件 3. 确保 `Core/Inc` 目录在包含路径中: - 打开项目选项 (Options for Target) - 转到 C/C++ 选项卡 - 在 "Include Paths" 中添加 `Core/Inc` 目录 #### 4. 修改 tft_gfx.h 文件 更新 `tft_gfx.h` 文件,确保正确包含字体头文件: ```c #ifndef __TFT_GFX_H #define __TFT_GFX_H #include "stm32f1xx_hal.h" #include "tft_fonts.h" // 确保这一行存在 // 颜色定义保持不变... // 函数声明保持不变... #endif /* __TFT_GFX_H */ ``` ### 字体数据管理建议 1. **优化字体存储**: - 使用压缩算法减少字体数据占用空间 - 只包含项目实际需要的字符集 2. **动态字体加载**: ```c // 在tft_fonts.c中添加 #define FONT_CHAR_OFFSET 32 // ASCII 32 (空格) 是第一个字符 const uint16_t* TFT_GetCharData(FontDef* font, char c) { uint8_t index = (uint8_t)c - FONT_CHAR_OFFSET; uint16_t charsPerFont = (font->height * font->width) / 16; return &font->data[index * charsPerFont]; } ``` 3. **使用外部存储器**: - 对于大型字体,存储在外部SPI Flash中 - 按需加载字符数据 ### 替代解决方案:使用单一头文件 如果不想添加额外的 `.c` 文件,可以将字体数据直接放在头文件中: ```c // 在 tft_fonts.h 中添加字体数据 #ifndef __TFT_FONTS_H #define __TFT_FONTS_H #include "stm32f1xx_hal.h" typedef struct { uint8_t width; uint8_t height; const uint16_t *data; } FontDef; // 7x10 字体数据 static const uint16_t Font7x10_Data[] = { // 字符数据... }; static FontDef Font_7x10 = { 7, 10, Font7x10_Data }; // 其他字体... #endif ``` ### 项目文件结构验证 确保项目结构如下: ``` Project/ ├── Core/ │ ├── Inc/ │ │ ├── main.h │ │ ├── dht11.h │ │ ├── tft_gfx.h │ │ └── tft_fonts.h // 新增文件 │ ├── Src/ │ │ ├── main.c │ │ ├── dht11.c │ │ ├── tft_gfx.c │ │ ├── buzzer.c │ │ └── tft_fonts.c // 新增文件 ``` ### 字体数据生成工具 如果需要完整的字体集,可以使用以下工具: 1. **Dot Factory** (Windows):开源位图字体生成器 2. **GFX Font Creator** (在线工具) 3. **Image2LCD**:商业软件,支持多种输出格式 ### 编译验证 完成以上步骤后: 1. 清理项目:Project → Clean Target 2. 重新构建:Project → Rebuild all target files 3. 验证输出:应该没有 "tft_fonts.h" 相关的错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁保康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值