热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GB2312和ASCII码点阵字库HZK,ASC说明使用心得,全

这几天接了一个项目,需要制作点阵文字,所以接触了字库这东西,由于网上字库挺多的,但是不全,有的字库全,但是字库的读取代码只有一部分,所以还是花费了一天时间搞这东西。现在整理了一份叫全的

这几天接了一个项目,需要制作点阵文字,所以接触了字库这东西,由于网上字库挺多的,但是不全,有的字库全,但是字库的读取代码只有一部分,所以还是花费了一天时间搞这东西。现在整理了一份叫全的字体,并配上每种字体的读取代码。下载地址:>>
网上介绍概念的文章有很多,这里我就引用一下了。>>这里包含了HZK字库和ASC字库,写了两个类进行读取,代码如下

HZK:
import java.io.FileInputStream;
import java.io.IOException;


public class Char2Mat {
private int font_size = 48;
private int font_height = font_size;
private int font_width = font_size;
private int size_step = 8;
private char word = '我';
private byte[] cbuf;
private char[] key = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

Char2Mat(int font_size, char word) {
this.font_size = font_size;
this.font_height = font_size;
if (font_size != 12)
this.font_width = font_size;
else
this.font_width = 16;
this.word = word;
}

public void getMat() {
try {
int sizeof_byte = size_step;
int offset_step = font_width * font_height / sizeof_byte;

byte[] incode = String.valueOf(word).getBytes("GB2312");
int t1 = (int) (incode[0] & 0xff);
int t2 = (int) (incode[1] & 0xff);
int offset = 0;

// calculate offset for different size font
if (t1 > 0xa0) {
if (font_size == 40 || font_size == 48) {
// 这里暂不处理t1 <0xa1 + 0x0f的部分,注意大于24的字体都是倒立了的
offset = ((t1 - 0xa1 - 0x0f) * 94 + (t2 - 0xa1))
* offset_step;
} else if (font_size == 12 || font_size == 16 || font_size == 24 || font_size == 32) {
offset = ((t1 - 0xa1) * 94 + (t2 - 0xa1)) * offset_step;
}
} else {
offset = (t1 + 156 - 1) * offset_step;
}

cbuf = new byte[offset_step];
FileInputStream inputStream = new FileInputStream("HZK"
+ String.valueOf(font_size));
inputStream.skip(offset);
if (inputStream.read(cbuf, 0, offset_step) <0) {
System.out.println("read failed!");
return;
}

inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public void print() {
if (font_size == 40 || font_size == 48) {
for (int i = 0; i for (int j = 0; j int index = i * font_width + j;
int flag = cbuf[index / size_step] & key[index % size_step];
System.out.print(flag > 0 ? "●" : "○");
}
System.out.println();
}
} else if (font_size == 12 || font_size == 16 || font_size == 24 || font_size == 32) {
for (int i = 0; i for (int j = 0; j int index = j * font_width + i;
int flag = cbuf[index / size_step] & key[index % size_step];
System.out.print(flag > 0 ? "●" : "○");
}
System.out.println();
}
}
}
}

ASC:
// 只用于95个可显示ASCII符号

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class Num2Mat {
private int font_width = 8;
private int font_height = 12;
private int size_step = 8;
private char char_num = '1';
private byte[] cbuf;
private char[] key = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

Num2Mat(int font_height, int font_width, char char_num) {
this.font_height = font_height;
this.font_width = font_width;
this.char_num = char_num;
}

public void getMat() {
int sizeof_byte = size_step;
int offset_step = font_width * font_height / sizeof_byte;

int ascii = (int) char_num;
if (ascii > 127 || ascii <32) {
System.out.println("input char is invaild!");
return;
}
int offset = (ascii - 32) * offset_step;

try {

cbuf = new byte[offset_step];
FileInputStream inputStream = inputStream = new FileInputStream(
"ASC" + String.valueOf(font_height) + "_" + String.valueOf(font_width));
inputStream.skip(offset);
if (inputStream.read(cbuf, 0, offset_step) <0) {
System.out.println("read failed!");
return;
}

inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void print() {
if (font_height == 12 || font_height == 48) {
// 横向取字
for (int i = 0; i for (int j = 0; j int index = i * font_width + j;
int flag = cbuf[index / size_step] & key[index % size_step];
System.out.print(flag > 0 ? "●" : "○");
}
System.out.println();
}
} else {
// 纵向取字
for (int i = 0; i for (int j = 0; j int index = j * font_height + i;
int flag = cbuf[index / size_step] & key[index % size_step];
System.out.print(flag > 0 ? "●" : "○");
}
System.out.println();
}
}
}
}

调用示例:

import java.io.*;

public class Font {
public static void main(String[] args) {
Char2Mat cm = new Char2Mat(16, '我');
cm.getMat();
cm.print();

Num2Mat nm = new Num2Mat(48, 24, 'A');
nm.getMat();
nm.print();
}
}

注意点:

  1. GB2312
    包含12*12, 16*16, 24*24, 32*32, 40*40, 48*48五个尺寸
    • HZK12 显示是按12*12点阵显示,但是存储的时候由于计算机是按8位整数倍储存,所以实际这个字库是按12*16储存的,多了4列,所以显示的时候有特别处理
    • 12,16,24,32尺寸的字库都是按列取值的,40,48都是按行取值的
    • 40,48尺寸的字库把汉字库和全角字符库分开了,因为我们只需汉字库,所以在计算这两个吃出汉字库的offset时,需要多减去0x0f
  2. ASCII
    包含12*8, 16*8, 24*12, 32*16, 48*24
    • 所有的ASC字库都只存储了可显示的ASCII字符,所以计算offset时,要减去32
    • 12*8和48*24的字库是按行取值,其他是按列取值

推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
author-avatar
幽雅闲居xl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有