如何获得字库中的所有符号或文字

其实我也恋长安 2021-03-04 05:03:38
请问有人知道如何使用C语言提取ttf字库文件中的所有字符吗,freetype也没有找到相关的函数
...全文
747 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_45334213 2021-03-09
  • 打赏
  • 举报
回复
......................................................
finalfantasy_xu 2021-03-08
  • 打赏
  • 举报
回复
学习一下了!
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
仅供参考:
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;

    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

        CloseHandle (hFile);
    }

    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);

    return 0;
}
趁CSDN的程序猿表情还没戒烟,我赶紧多抽两口!
forever74 2021-03-05
  • 打赏
  • 举报
回复
编码的意思就是你输入的字的内码,编码空间就是内码的取值范围。 结合你编程环境的实际情况,写个循环就好。
  • 打赏
  • 举报
回复
引用 4 楼 forever74 的回复:
最笨最简单的办法,循环穷举编码空间,找不到的跳过。
编码空间怎么弄,能否详细说下吗
forever74 2021-03-05
  • 打赏
  • 举报
回复
最笨最简单的办法,循环穷举编码空间,找不到的跳过。
  • 打赏
  • 举报
回复
我可以通过freetype输入自定义的文字,然后生成bmp图片,但是我不想输入自定义的字,想直接获得字体文件中的字,然后再将所有文字显示到一张图片中
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
https://tchayen.github.io/posts/ttf-file-parsing
看了下,都是JavaScript,看不太懂,而且我这边也只能用C
  • 打赏
  • 举报
回复
引用 8 楼 早打大打打核战争 的回复:
GetFontUnicodeRanges
这个函数可以,我去找找用法。
  • 打赏
  • 举报
回复
引用 6 楼 forever74 的回复:
编码的意思就是你输入的字的内码,编码空间就是内码的取值范围。 结合你编程环境的实际情况,写个循环就好。
好的,谢谢
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
WCRANGE [This is preliminary documentation and subject to change.] The WCRANGE structure specifies a range of Unicode characters. typedef struct tagWCRANGE { WCHAR wcLow; USHORT cGlyphs; } WCRANGE, *PWCRANGE,FAR *LPWCRANGE; Members wcLow Low Unicode code point in the range of supported Unicode code points. cGlyphs Number of supported Unicode code points in this range. QuickInfo Windows NT: Requires version 5.0 or later. Windows: Requires Windows 98 or later. Windows CE: Unsupported. Header: Declared in wingdi.h. See Also Fonts and Text Overview, Font and Text Structures, GLYPHSET
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
GetFontUnicodeRanges [This is preliminary documentation and subject to change.] The GetFontUnicodeRanges function returns information about which Unicode characters are supported by a font. The information is returned as a GLYPHSET structure. WINGDIAPI DWORD WINAPI GetFontUnicodeRanges( HDC hdc, // handle to the device context LPGLYPHSET lpgs // pointer to the glyph set structure ); Parameters hdc Handle to the device context. lpgs Pointer to a buffer to contain the GLYPHSET structure. If this parameter is NULL, the function returns a pointer to the GLYPHSET structure for the current font. Return Values If the function succeeds, it returns a pointer to the font's GLYPHSET structure for the current device context. If the function fails, it returns zero. QuickInfo Windows NT: Requires version 5.0 or later. Windows: Unsupported. Windows CE: Unsupported. Header: Declared in wingdi.h. Import Library: Use gdi32.lib. See Also Fonts and Text Overview, Font and Text Functions, GLYPHSET GLYPHSET [This is preliminary documentation and subject to change.] The GLYPHSET structure contains information about a range of Unicode code points. typedef struct tagGLYPHSET { DWORD cbThis; DWORD flAccel; DWORD cGlyphsSupported; DWORD cRanges; WCRANGE ranges[1]; } GLYPHSET, *PGLYPHSET, FAR *LPGLYPHSET; Members cbThis Size, in bytes, of this structure. flAccel Flags describing the maximum size of the glyph indices. This member can be the following value: Value Meaning GS_8BIT_INDICES Treat glyph indices as 8-bit wide values. Otherwise, they are 16-bit wide values. cGlyphsSupported Total number of Unicode code points supported in the font. cRanges Total number of Unicode ranges in ranges. ranges Array of Unicode ranges that are supported in the font. QuickInfo Windows NT: Requires version 5.0 or later. Windows: Requires Windows 98 or later. Windows CE: Unsupported. Header: Declared in wingdi.h. See Also Fonts and Text Overview, Font and Text Structures, GetFontUnicodeRanges, WCRANGE
  • 打赏
  • 举报
回复
GetFontUnicodeRanges
PCtoLCD2002使用教程 在正式版,用户可生成自己需要的各种小字库,也可以生成自定义的国标一二级汉字库。 0.生成自定义的小字库: 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵显示12*12大小的汉字) 1.将您需要的汉字和符号形成一个文本文件 2.使用“导入文本”的按钮 3.确认“生成二进制字库”被选(建议选"生成索引文件"原因后析) 4.点“开始生成”按钮,选择生成的字库文件名 5.然后耐心等待一段时间(与处理文本大小有关),在此期间建议不要动键盘和鼠标。 6.字库生成完毕. 1.生成国标一二级汉字库 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵显示12*12大小的汉字). 1.使用“导入文本”的按钮 2.点右下角"生成国标汉字库"按钮. 3.选择字库文件名后单击确定 4.耐心等待一段时间后既得到生成的汉字库(时间视具体机器而定). 生成汉字库结构介绍 本软件使用的汉字库采用与HZK16相近似的结构,即按照输入汉字的顺序依次排列各汉字的 点阵数据,以生成的16*16点阵汉字库举例介绍 16*16点阵汉字库 点阵大小16*16,所以每个汉字点阵数据占用32个字节.用户要使用生成的16*16点阵小字库 的点阵数据,可以在程序采用如下算法: 0.在生成的字库汉字列表得到该汉字的偏移量,也就是汉字的记录号HzNum 1.将其*32(HzNum*32)即可得出该汉字点阵在字库的偏移地址. 3.以这个偏移地址为起点,连续读取文件的32个字节,既为该汉字的点阵信息. 实际上,对于本软件生成的16*16点阵的国标汉字库是采用区位码排列的,所以与标准的HZK16 结构是一样的,完全可以互换使用. 例如生成一个24*48点阵,楷体,倾斜的汉字库, 0.由于每个汉字占用24*48/8= 144个字节,所以用户可先读取生成的索引列表找到该汉 字的记录号. 1.将记录号*144即得到该汉字在字库的偏移地址. 2.以这个偏移地址为起点,在字库文件连续读取144个字节,即为该汉字的点阵信息. 对于其他点阵汉字库的使用方法,可以依次类推…… 当然,如果不选“生成二进制字库”的复选框,生成的字库将是文本格式的字模数据,采 用那种方式完全取决于您的需要了 完美版新增生成英文点阵字库功能,使用方法同上。
在正式版,用户可生成自己需要的各种小字库,也可以生成自定义的国标一二级汉字库。 0.生成自定义的小字库: 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵显示12*12大小的汉字) 1.将您需要的汉字和符号形成一个文本文件 2.使用“导入文本”的按钮 3.确认“生成二进制字库”被选(建议选"生成索引文件"原因后析) 4.点“开始生成”按钮,选择生成的字库文件名 5.然后耐心等待一段时间(与处理文本大小有关),在此期间建议不要动键盘和鼠标。 6.字库生成完毕. 1.生成国标一二级汉字库 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵显示12*12大小的汉字). 1.使用“导入文本”的按钮 2.点右下角"生成国标汉字库"按钮. 3.选择字库文件名后单击确定 4.耐心等待一段时间后既得到生成的汉字库(时间视具体机器而定). 生成汉字库结构介绍 本软件使用的汉字库采用与HZK16相近似的结构,即按照输入汉字的顺序依次排列各汉字的 点阵数据,以生成的16*16点阵汉字库举例介绍 16*16点阵汉字库 点阵大小16*16,所以每个汉字点阵数据占用32个字节.用户要使用生成的16*16点阵小字库 的点阵数据,可以在程序采用如下算法: 0.在生成的字库汉字列表得到该汉字的偏移量,也就是汉字的记录号HzNum 1.将其*32(HzNum*32)即可得出该汉字点阵在字库的偏移地址. 3.以这个偏移地址为起点,连续读取文件的32个字节,既为该汉字的点阵信息. 实际上,对于本软件生成的16*16点阵的国标汉字库是采用区位码排列的,所以与标准的HZK16 结构是一样的,完全可以互换使用. 例如生成一个24*48点阵,楷体,倾斜的汉字库, 0.由于每个汉字占用24*48/8= 144个字节,所以用户可先读取生成的索引列表找到该汉 字的记录号. 1.将记录号*144即得到该汉字在字库的偏移地址. 2.以这个偏移地址为起点,在字库文件连续读取144个字节,即为该汉字的点阵信息. 对于其他点阵汉字库的使用方法,可以依次类推…… 当然,如果不选“生成二进制字库”的复选框,生成的字库将是文本格式的字模数据,采 用那种方式完全取决于您的需要了 完美版新增生成英文点阵字库功能,使用方法同上。
在正式版,用户可生成自己需要的各种小字库,也可以生成自定义的国标一二级汉字库。 0.生成自定义的小字库: 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵显示12*12大小的汉字) 1.将您需要的汉字和符号形成一个文本文件 2.使用“导入文本”的按钮 3.确认“生成二进制字库”被选(建议选"生成索引文件"原因后析) 4.点“开始生成”按钮,选择生成的字库文件名 5.然后耐心等待一段时间(与处理文本大小有关),在此期间建议不要动键盘和鼠标。 6.字库生成完毕. 1.生成国标一二级汉字库 0.使用PCTOLCD的各种调整功能调整出您需要的文字样式,如字体,字样(下划,倾斜,加 粗),大小(各种点阵大小的字体,可锁定点阵本身大小(如16*16),然后在这个固定的点阵大小 内调节文字的大小(例如在16*16的点阵显示12*12大小的汉字). 1.使用“导入文本”的按钮 2.点右下角"生成国标汉字库"按钮. 3.选择字库文件名后单击确定 4.耐心等待一段时间后既得到生成的汉字库(时间视具体机器而定). 生成汉字库结构介绍 本软件使用的汉字库采用与HZK16相近似的结构,即按照输入汉字的顺序依次排列各汉字的 点阵数据,以生成的16*16点阵汉字库举例介绍 16*16点阵汉字库 点阵大小16*16,所以每个汉字点阵数据占用32个字节.用户要使用生成的16*16点阵小字库 的点阵数据,可以在程序采用如下算法: 0.在生成的字库汉字列表得到该汉字的偏移量,也就是汉字的记录号HzNum 1.将其*32(HzNum*32)即可得出该汉字点阵在字库的偏移地址. 3.以这个偏移地址为起点,连续读取文件的32个字节,既为该汉字的点阵信息. 实际上,对于本软件生成的16*16点阵的国标汉字库是采用区位码排列的,所以与标准的HZK16 结构是一样的,完全可以互换使用. 例如生成一个24*48点阵,楷体,倾斜的汉字库, 0.由于每个汉字占用24*48/8= 144个字节,所以用户可先读取生成的索引列表找到该汉 字的记录号. 1.将记录号*144即得到该汉字在字库的偏移地址. 2.以这个偏移地址为起点,在字库文件连续读取144个字节,即为该汉字的点阵信息. 对于其他点阵汉字库的使用方法,可以依次类推……

69,322

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧