热门标签 | 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的字库是按行取值,其他是按列取值

推荐阅读
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了Java中的`ByteArrayInputStream`和`ByteArrayOutputStream`,包括它们的基本概念、工作原理及具体应用实例。`ByteArrayInputStream`用于处理内存中的字节数组,而`ByteArrayOutputStream`则用于将数据写入内存中的字节数组。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 使用WinForms 实现 RabbitMQ RPC 示例
    本文通过两个WinForms应用程序演示了如何使用RabbitMQ实现远程过程调用(RPC)。一个应用作为客户端发送请求,另一个应用作为服务端处理请求并返回响应。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • 本文介绍了一种在Win10 UWP应用中实现根据数值动态改变颜色的控件的方法。通过将椭圆的颜色与整数绑定,并利用值转换器来实现颜色的渐变效果。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
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社区 版权所有