搜索
bottom↓
回复: 44

分享一个汉字点阵字库制作工具 HanzFontMaker

  [复制链接]

出870入263汤圆

发表于 2014-1-13 16:35:04 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出870入263汤圆

 楼主| 发表于 2015-6-12 20:02:31 | 显示全部楼层
字符绘制详解

使用演示
http://v.youku.com/v_show/id_XNjc5NTA0Nzcy.html
配套使用的另一个更灵活一点的工具

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出870入263汤圆

 楼主| 发表于 2015-6-12 20:05:35 | 显示全部楼层
计算字库中字符所在偏移地址的算法:


  1. // 例如:汉字“好”的GBK码是BAC3,参数gbk就是0xBAC3。其中,BA叫区码,C3叫位码!
  2. // 必须保证传入函数的参数gbc是个合格的GBK编码。
  3. // 设font->CharSize是:每个字符位图的字节数。
  4. // 设font->flashOffset是:该字体在flash中的烧写地址。
  5. int getCharOffset(font_type *font, uint16_t gbc){
  6.     int offset;
  7.     if(gbc < 0x80){
  8.         offset = (gbc - 0x20) * font->CharSize;
  9.     }else{
  10.         offset = (gbc & 0xFF) - 0xA1;
  11.         gbc >>= 8;
  12.         offset += (gbc - 0xA1) * 94;
  13.         offset = (96 + offset) * font->CharSize;
  14.     }
  15.     return offset + font->flashOffset + 256;
  16. }

  17. // 例如:汉字“好”的GBK码是BAC3,参数gbk就是0xBAC3。其中,BA叫区码,C3叫位码!
  18. // 必须保证传入函数的参数gbc是个合格的GBK编码。
  19. // 设font->CharSize是:每个字符位图的字节数。
  20. // 设font->flashOffset是:该字体在flash中的烧写地址。
  21. int drawChar(font_type *font, uint16_t gbc){
  22.     int offset;
  23.     if(gbc < 0x80){
  24.         offset = (gbc - 0x20) * font->CharSize;
  25.     }else{
  26.         offset = (gbc & 0xFF) - 0xA1;
  27.         gbc >>= 8;
  28.         offset += (gbc - 0xA1) * 94;
  29.         offset = (96 + offset) * font->CharSize;
  30.     }
  31.     offset += font->flashOffset + 256;
  32.     // 下面开始绘制一个点阵位图;仅为了演示扫描规则,所以绘制整个位图。
  33.     // 而且,不顾效率的使用malloc申请动态内存,其实只要一个静态数组即可。
  34.     uint8_t *pdata = malloc(font->CharSize);
  35.     if(pdata){
  36.       FLASH_Read(pdata, offset, font->CharSize);
  37.       int byteNum = font->CharSize;
  38.       uint8_t *pscan = pdata;
  39.       // 假设你调用该函数之前,已经为该字符设定了LCD传送窗口。所以这里
  40.       // 代码就不再涉及到LCD的坐标定位和换行这些操作了!
  41.       // 下面从左到右,从上到下的依次送出每个位对应的点阵。
  42.       while(byteNum-- > 0){
  43.         uint8_t mask = 0x80;
  44.         while(mask){
  45.           if(pscan[0] & mask){
  46.             // 送出字体颜色到LCD。
  47.           }else{
  48.             // 送出背景颜色到LCD。
  49.           }
  50.           mask >>= 1;
  51.         }
  52.         pscan++;
  53.       }
  54.       free(pdata);
  55.     }
  56. }

复制代码

出0入0汤圆

发表于 2014-1-13 16:50:43 | 显示全部楼层
比PCtoLCD2002还好用?

出870入263汤圆

 楼主| 发表于 2014-1-13 17:04:19 | 显示全部楼层
2002是年份还是20x2的缩写?如果是年份,那软件有点老了,如果是20X2,就是一种字符屏规格。呵呵

出0入0汤圆

发表于 2014-1-13 17:08:08 来自手机 | 显示全部楼层
支持一下先

出50入0汤圆

发表于 2014-1-14 14:30:29 | 显示全部楼层
楼主大拿,顶一个;试用一下确实方便。

出0入0汤圆

发表于 2014-1-14 21:35:51 | 显示全部楼层
收藏        

出0入0汤圆

发表于 2014-1-15 11:10:21 | 显示全部楼层
学习一下。谢谢分享。

出0入0汤圆

发表于 2014-1-15 12:33:39 来自手机 | 显示全部楼层
字符点阵制作,马克下!谢楼主

出0入0汤圆

发表于 2014-1-15 14:52:12 | 显示全部楼层
PCBBOY1991 发表于 2014-1-13 16:50
比PCtoLCD2002还好用?

我用的也是这个PCtoLCD2002,主要是在字符模式下,反应较慢,其它都很好用!+1

出0入0汤圆

发表于 2014-1-15 15:00:43 | 显示全部楼层
本帖最后由 dingzy2002 于 2014-1-15 15:05 编辑

不算好用,主要是①窗口的文字太小了,不能放大②不能单独提取字符(仅为显示部分文字时使用)

出0入0汤圆

发表于 2014-1-16 00:42:26 | 显示全部楼层
支持一下!正需要!

出870入263汤圆

 楼主| 发表于 2014-1-18 20:11:11 | 显示全部楼层
本帖最后由 armstrong 于 2014-1-18 20:13 编辑

新的配套工具出来了,可以调整字符在点阵位图中的偏移位置,还可以动态调整位图的宽度和高度;这些功能在制作像“微软雅黑”这样的字体时非常有用!不过字库编辑还需原来的工具完成。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-2-13 15:31:23 | 显示全部楼层
不错,谢谢分享

出870入263汤圆

 楼主| 发表于 2014-3-2 21:22:56 | 显示全部楼层
HanzFontMaker 使用视频指导:
http://v.youku.com/v_show/id_XNjc5NTA0Nzcy.html

出870入263汤圆

 楼主| 发表于 2014-3-2 21:24:25 | 显示全部楼层
<embed src="http://player.youku.com/player.php/sid/XNjc5NTA0Nzcy/v.swf" allowFullScreen="true" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash"></embed>

出0入0汤圆

发表于 2014-3-2 22:47:44 | 显示全部楼层
支持!!

出0入0汤圆

发表于 2014-3-3 00:45:54 来自手机 | 显示全部楼层
支持,谢谢分享

出0入0汤圆

发表于 2014-3-3 13:53:03 | 显示全部楼层
谢谢,收下了!

出0入0汤圆

发表于 2014-3-4 08:42:01 | 显示全部楼层
果断收藏

出0入0汤圆

发表于 2014-4-2 14:36:14 | 显示全部楼层
楼主看这个,怎么显示不完啊?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出870入263汤圆

 楼主| 发表于 2014-4-2 14:46:47 | 显示全部楼层
你好,用12楼的工具再试试看你选择的字体;可能是有些字符的宽度计算不正确导致的,这是Graphics.MeasureString()函数测量的宽度,如果还是有问题,我只能试图换一种宽度测量方法了。

出0入0汤圆

发表于 2014-5-25 00:03:50 | 显示全部楼层
解压后怎么没有hanz.bin 文件?

出0入0汤圆

发表于 2014-5-25 00:16:57 | 显示全部楼层
已经解决  要运行转换一次C文件后自动生成。谢谢楼主分享!

出0入0汤圆

发表于 2014-5-27 15:38:11 | 显示全部楼层
不错,谢谢分享

出870入263汤圆

 楼主| 发表于 2014-5-27 16:05:02 | 显示全部楼层
补上生成的head.c文件里的数据结构定义,给需要的人提供参考:
  1. typedef struct {
  2.     U8 Width;
  3.     U8 Height;
  4. } MapSize_T;

  5. typedef struct {
  6.     U16 CharSize;       // 字符位图的总字节数。
  7.     U8  CharStride;     // 字符位图的行字节数。
  8.     U8  CharLines;      // 字符位图行数,总有:CharSize=CharStride*CharLines;
  9.     U8  GBKWidth;       // 字符的显示点阵宽度。
  10.     U8  GBKHeight;      // 字符的显示点阵高度。
  11.     const MapSize_T *ASCInfo;
  12.     void (*ReadCharData)(void *buf, U32 index, U16 len);
  13. } FontEx_T;
复制代码

出870入263汤圆

 楼主| 发表于 2014-5-27 16:06:52 | 显示全部楼层
对应emWin的字符显示函数为:
  1. void GUI_FontEx_DispChar(U16 c)
  2. {
  3.     static U8 _cbuf[32*32/8];
  4.     if(GUI_FontEx_IsInFont(GUI_pContext->pAFont, c)){
  5.         const GUI_FONT *pFont = GUI_pContext->pAFont;
  6.         const FontEx_T *pProp = (const FontEx_T *)pFont->p.pFontData;
  7.         if(pProp){
  8.             GUI_DRAWMODE OldDrawMode;
  9.             int xdist = 0;
  10.             U32 offset = 0;

  11.             if(sizeof(_cbuf) < pProp->CharSize){
  12.                 // 缓冲区不足以容纳字符位图。
  13.                 return;
  14.             }
  15.             // ASCII码。
  16.             if(c < 0x80){
  17.                 c -= 0x20;
  18.                 xdist = (pProp->ASCInfo[c]).Width;
  19.                 // 单字节的ASCII字符偏移为256。
  20.                 offset = FONT_CHARMAP_BEGIN + c * pProp->CharSize;
  21.             }
  22.             // GBK汉字码。
  23.             else{
  24.                 xdist = pProp->GBKWidth;
  25.                 offset = ((c & 0xFF) - 0xa1);
  26.                 c >>= 8;
  27.                 offset += (c - 0xa1) * 94;
  28.                 // 双字节的GBK字符偏移为256+96个ASCII字符总和。
  29.                 offset = FONT_CHARMAP_BEGIN + (96 + offset) * pProp->CharSize;
  30.             }
  31.             // 从外部Flash读取一个字符的MAP位图。
  32.             pProp->ReadCharData(_cbuf, offset, pProp->CharSize);
  33.             OldDrawMode  = LCD_SetDrawMode(GUI_pContext->TextMode);
  34.             LCD_DrawBitmap( GUI_pContext->DispPosX, GUI_pContext->DispPosY,
  35.                                 xdist,
  36.                                 pFont->YDist,
  37.                                 pFont->XMag,
  38.                                 pFont->YMag,
  39.                                 1,     /* Bits per Pixel */
  40.                                 pProp->CharStride,
  41.                                 _cbuf,
  42.                                 GUI_pContext->LCD_pBkColorIndex
  43.                                 );
  44.             LCD_SetDrawMode(OldDrawMode);
  45.             GUI_pContext->DispPosX += xdist * pFont->XMag;
  46.         }
  47.     }
  48. }
复制代码

出870入263汤圆

 楼主| 发表于 2014-5-27 16:09:51 | 显示全部楼层
上楼代码中,宏定义FONT_CHARMAP_BEGIN为:
#define FONT_CHARMAP_BEGIN  (256)
这是因为字符位图从字库文件的256字节偏移之后开始存储。

出0入46汤圆

发表于 2014-11-8 18:40:58 | 显示全部楼层
请问楼主说明文档中提到的:“字符的取模规则是横向左高位”,是一行一行高位在左取的吗?
比如图片中5*7点阵的数字1
取出来的字模是{0x20,0x60,0x20,0x20,0x20,0x20,0x70}
还是{0x00,0x42,0xFE,0x02,0x00}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-11 10:18:37 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2014-11-11 10:38:33 来自手机 | 显示全部楼层
mark mark,谢谢分享

出870入263汤圆

 楼主| 发表于 2014-11-11 13:28:40 | 显示全部楼层
工程师030 发表于 2014-11-8 18:40
请问楼主说明文档中提到的:“字符的取模规则是横向左高位”,是一行一行高位在左取的吗?
比如图片中5*7点 ...

取出来的字模是{0x20,0x60,0x20,0x20,0x20,0x20,0x70},就是这个。

出0入46汤圆

发表于 2014-11-11 18:49:48 | 显示全部楼层
armstrong 发表于 2014-11-11 13:28
取出来的字模是{0x20,0x60,0x20,0x20,0x20,0x20,0x70},就是这个。

您是作者吗?如果可以修改取模方式就完美了

出0入0汤圆

发表于 2014-11-11 19:00:54 | 显示全部楼层
实用的工具

出0入0汤圆

发表于 2014-11-11 19:38:58 | 显示全部楼层
果断支持一下。

出0入0汤圆

发表于 2014-11-11 19:50:43 | 显示全部楼层
赞一个先,下载试用。

出0入13汤圆

发表于 2015-6-14 07:56:27 来自手机 | 显示全部楼层
不错的工具,支持一个

出0入0汤圆

发表于 2015-6-14 08:12:12 | 显示全部楼层
感觉不错,先MK一下

出0入0汤圆

发表于 2015-9-29 14:34:53 | 显示全部楼层
楼主,bin文件怎么使用呢

出0入0汤圆

发表于 2015-9-29 16:15:02 | 显示全部楼层
不明白做出的字库内汉字内码计算咋和GBK不一样呢

出0入0汤圆

发表于 2015-9-29 20:31:03 | 显示全部楼层
还是freetype2矢量字体好用。

出0入0汤圆

发表于 2015-9-30 12:27:27 | 显示全部楼层
赞一个 比之前用的好多了

出0入0汤圆

发表于 2017-12-4 23:18:20 | 显示全部楼层
楼主是作者嘛,支持非等宽字体嘛?

出870入263汤圆

 楼主| 发表于 2020-4-3 22:29:38 | 显示全部楼层
需要看这两个软件源码的坛友,请移步此贴:发一个功能完整的字体取模软件,支持所有字体!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 03:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表