为后续使用(ssd1306)12864oled(或12832oled)展示中文做准备~
中文点阵字库原理
- 这篇文章我觉得很容易看懂,对理解字库原理非常重要:《HZK16汉字16*16点阵字库的使用及示例程序 》
- 请优先读这篇文章,再往后看本文
- 作者在文章中提供了字库的下载地址,这里就不贴了。
具体java代码
- 本代码仅为了精简且让大家看懂,很多代码安全、魔鬼数字以及性能的东西未考虑,实际生产环境的代码请自行完善。
public static void encode() throws IOException {
String str = "我";
//16*16点阵的汉字占用32个字节
byte[] cbuf = new byte[32];
//这个是取点阵的“位”的
char[] key = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
byte[] bytes = str.getBytes("GB2312");
//这中写法是把byte转成int的
int segNum = bytes[0] & 0xff;
int bitNum = bytes[1] & 0xff;
//算出这个字在字库文件中的偏移量,注意32是表示16*16像素的字站32个字节
//仔细理解本文开头提到的字库原理,才能理解本关键公式!!
int offset = (94 * (segNum - 0xa0 - 1) + (bitNum - 0xa0 - 1)) * 32;
System.out.println("offset = " + offset);
//读取点阵字库文件,需要按需修改为你电脑上实际字库的绝对地址
ClassPathResource classPathResource = new ClassPathResource("HZK16C");
InputStream inputStream = classPathResource.getInputStream();
//跳过offset个字节,读取“我”字占用的32个字节
inputStream.skip(offset);
inputStream.read(cbuf);
//展示逻辑
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
int index = i * 16 + j;
int flag = cbuf[index / 8] & key[index % 8];
System.out.print(flag > 0 ? "■ " : " ");
}
System.out.println();
}
}
- 执行该代码,可得到输出见下,人站远点看还是能看出来是个我字的:
offset = 136928
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■