虽然点阵提取工具,网上有很多了,但是找来找去,没找到我满意的工具,于是自己写了一个小工具。
点阵字体,在嵌入式GUI开发中,用得也是非常频繁的。
主要有两种使用场景:
1.生成某种编码的全部点阵,以BIN的形式放在FLASH中加载。
2.生成部份文字的点阵,以C文件的方式,写在代码里。
本工具的特点:
1.完全免费,不用到处找破解工具;
2.通用性好,支持任意编码,任意语言,可以自定义编码;
3.可以生成BIN和C文件;
4.可以使用WINDOWS全部字体;
5.使用方便,界面整洁;
作者:星沉地动
//————————————————————————————————————————-
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 打开
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 中去吗?