通用点阵字库生成工具

虽然点阵提取工具,网上有很多了,但是找来找去,没找到我满意的工具,于是自己写了一个小工具。
点阵字体,在嵌入式GUI开发中,用得也是非常频繁的。

主要有两种使用场景:

1.生成某种编码的全部点阵,以BIN的形式放在FLASH中加载。

2.生成部份文字的点阵,以C文件的方式,写在代码里。

本工具的特点:

1.完全免费,不用到处找破解工具;

2.通用性好,支持任意编码,任意语言,可以自定义编码;

3.可以生成BIN和C文件;

4.可以使用WINDOWS全部字体;

5.使用方便,界面整洁;

界面效果图:
通用点阵字库生成工具_第1张图片

作者:星沉地动

//————————————————————————————————————————-

2017.09.02 (V1.1)

添加高位在前和低位在前的选项;

调整预览界面;

下载地址1:http://446252221.ys168.com/ (我的工具/通用点阵提取工具V1.1.zip 247KB)

下载地址2:https://pan.baidu.com/s/1kVBUGbt

//————————————————————————————————————————-

2017.09.15

公开此工具源代码:

https://github.com/Jiangxiaogang/FontMaker

//————————————————————————————————————————

2017.10.12(V1.1.2)

优化输出C文件数据格式;

下载地址1:http://446252221.ys168.com/ (我的工具/通用点阵提取工具-V1.1.2.zip 247KB)

下载地址2:https://pan.baidu.com/s/1geZ51rt

常见问题:

1.如何使用其它标准字符集?

在软件目录下有一个”charset”文件夹,程序启动的时候会扫描该文件夹下面的*.cst文件,并加入标准字库列表中;

cst文件就是码表文件,每个CST文件代表一种字符编码表,CST文件的数据格式为字符集中所有字符的UNICODE编码,2字节为一个单位,低字节在前。

该文件夹下面有一个“charset.exe”的程序,可以方便地生成大多数标准码表.

2.字符集中的“用户定义”是什么意思?

使用非标准字符集的使用可以使用自定义码表,比如简体中文的编码是GB2312,有6000多文字,但如果实际项目中你只想要“中华人民共和国”这7个汉字,

就可以在输入框中输入你需要的文字,生成一个特殊应用的字库,当然这个字库中的文字的排列顺序与你输入的顺序保持一致。

3.如何使用生成的BIN文件?

本工具生成的BIN数据格式为最常用的数据格式,一般情况下兼容其它字库文件;

对于水平扫描方式,8bit对齐格式,比如12x12像素的字库,每一行有12个点,但是会占用16bit即2个字节来表示;

那么一个文字占用2x12=24字节,读取BIN的时候以24字节为单位读取即可;

4.生成BIN文件与生成C文件有什么区别?

BIN文件一般用在通过文件读取字库,C文件是嵌入到代码里的数据。

5.为什么有很多字体的中文文字看上去是一样的?

这是因为Windows自带的字体,大多数都不是中文字体,当显示中文的时候,系统会自动映射到默认的中文字体来显示,比如“宋体”,
宋体是使用点阵最清晰,最常规的字体,推荐使用宋体来做中文字库。

转载 :
https://blog.csdn.net/qq446252221/article/details/53188278

源码:
https://download.csdn.net/download/wowocpp/10513893

最好是用vs2010 打开

通用点阵字库生成工具_第2张图片

通用点阵字库生成工具_第3张图片

void CBitFont::UpdateBitmap(void)
{
    HBITMAP hBitmap;
    BITMAPINFO bmi;
    ZeroMemory(&bmi,sizeof(bmi));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = m_nWidth;
    bmi.bmiHeader.biHeight = m_nHeight;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 8;
    bmi.bmiHeader.biCompression = BI_RGB;
    hBitmap = ::CreateDIBSection(m_hdc,&bmi,DIB_RGB_COLORS,(void**)&m_pPixels,NULL,0);
    if(hBitmap != NULL)
    {
        if(m_hBitmap != NULL)
        {
            ::DeleteObject(m_hBitmap);
        }
        ::SelectObject(m_hdc,hBitmap);
        m_hBitmap = hBitmap;
    }
}


CBitFont::CBitFont(void)
{
    HDC hdc;
    m_nOffsetX = 0;
    m_nOffsetY = 0;
    m_nWidth = 1;
    m_nHeight= 1;
    m_hBitmap = NULL;
    hdc = ::GetDC(NULL);
    m_hdc = ::CreateCompatibleDC(hdc);
    ::ReleaseDC(NULL,hdc);
    ::SetTextColor(m_hdc,RGB(255,255,255));
    ::SetBkColor(m_hdc,RGB(0,0,0));
}

void CBitFont::PaintFont(WCHAR ch)
{
    RECT rc;
    SetRect(&rc,0,0,m_nWidth,m_nHeight);
    ::FillRect(m_hdc,&rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
    ::TextOut(m_hdc,m_nOffsetX,m_nOffsetY,&ch,1);
}

这个里面的CreateDIBSection 的作用是什么?
CreateDIBSection 与m_hdc 结合之后,在m_hdc 中绘图,数据会实时的反应到CreateDIBSection 返回的hBitmap 中去吗?

你可能感兴趣的:(开源)