java中点阵字库的解析

news/2024/11/28 20:39:11/

最近研究点阵字库的展示,搜到很多东西,而且大多都是C语言做的,作为一个Android开发的码农,整理了一篇java版的,一方面自己记录,一方面帮助有需要的人。。。

 

点阵字,顾名思义,就是用点组成一个个的字,然后展示在某些东西上,常见的有成人用品店外面的LED上面那几个字,大家都懂得。

 

点阵字库就是收集了这些字的一个库。

 

有人要问了,为毛要有这个库,在点阵上面展示个字吗不就是,自己排版一下,然后点亮的用1,不亮的用0,然后记在文件里,用到的时候读取然后展示不就行了吗。

我要说,我开始也是这么想的。

但是,GBK有6763个汉字,你怎么破?

 

有人说有点阵字库生成器,输进去就出来编码了。

我要说,那个出来的是一个文本文件,而且我找了一个生成两个文件,一个索引文件,一个字库文件,而且两个加起来有1M左右~这个在我这个做Android的人眼里是巨大的文件了。

 

而且,点阵这个东西,有12*12,16*16,24*24,32*32。。。。各种型号,这个怎么破?

 

所以我在网上各种找资源,最后确定在HZK...和ASC..这些库上面了。

这个东西是啥呢?

其实是早期的DOS系统里面为了展示文字所用的文字库,和现在win和Mac下面的.ttf文件是一个意思,就是系统的字体库。

 

 UCDOS6.0系统文件列表 

 C:\UCDOS\FNT目录下:

ASC12             12x6点阵西文字库

HZK12             12x12点阵汉字库

HZK24T            24x24点阵中文符号字库

HZK24S            24x24点阵宋体汉字库

HZK12F            24x24点阵仿宋体汉字库

HZK12H            24x24点阵黑体汉字库

HZK12K            24x24点阵楷体汉字库

ASC40             40x20点阵西文字库

HZK40T            40x40点阵中文符号字库

HZK40S            40x40点阵宋体汉字库

ASC48             48x48点阵西文字库

HZK48T            48x48点阵中文符号字库

HZK48S            48x48点阵宋体汉字库

ASCPS             11种西文轮廓字库

HZKPST            中文符号轮廓字库

HZKPSSTJ          宋体汉字库

HZKPSFSJ          仿宋体汉字库

HZKPZHTJ          黑体汉字库

HZKPSKTJ          楷体汉字库

 

ps:上面这个是网上找的~我没有验证,而且我也只用了其中几个。

 

下面说说这玩意怎么用吧,这也是字库的好处之一,就是无需索引,你直接就能找到这个字的位置。

 

字库点阵格式定义

ASC12  ' 8x12 ASCII点阵 一个字符12Byte

ASC16  ' 8x16 ASCII点阵 一个字符16Byte

ASC48  '24x48 ASCII点阵 一个字符144Byte

 

HZK12  '16x12 宋体汉字点阵  一个汉字24Byte

HZK14  '16x14 宋体汉字点阵  一个汉字28Byte

HZK16  '16x16 宋体汉字点阵  一个汉字32Byte

HZK16F '16x16 繁体宋体汉字点阵  一个汉字32Byte

 

HZK24F '24x24 仿宋汉字打印点阵  一个汉字72Byte

HZK24H '24x24 黑体汉字打印点阵  一个汉字72Byte

HZK24K '24x24 楷体汉字打印点阵  一个汉字72Byte

HZK24S '24x24 宋体汉字打印点阵  一个汉字72Byte

HZK24T '24x24 宋体符号打印点阵  一个符号72Byte

 

HZK40S '40x40 宋体汉字点阵  一个汉字200Byte

HZK40T '40x40 宋体符号点阵  一个符号200Byte

 

HZK48S '48x48 宋体汉字点阵  一个汉字288Byte

HZK48T '48x48 宋体符号点阵  一个符号288Byte

 

http://bbs.csdn.net/topics/350189831

 

1.点阵字库

       点阵字库是把每一个汉字都分成16×16或24×24个点,然后用每个点的虚实来表示汉字的轮廓,常用来作为显示字库使用,这类点阵字库汉字最大的缺点是不能放大,一旦放大后就会发现文字边缘的锯齿。 

矢量字库保存的是对每一个汉字的描述信息,比如一个笔划的起始、终止坐标,半径、弧度等等。在显示、打印这一类字库时,要经过一系列的数学运算才能输出结果,但是这一类字库保存的汉字理论上可以被无限地放大,笔划轮廓仍然能保持圆滑,打印时使用的字库均为此类字库.

2.点阵字库结构

      在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0代表没有,1代表有点,将0和1分别用不同颜色画出,就形成了一个汉字,常用的点阵矩阵有12*12, 14*14, 16*16三种字库。  字库根据字节所表示点的不同有分为横向矩阵和纵向矩阵,目前多数的字库都是横向矩阵的存储方式(用得最多的应该是早期UCDOS字库),纵向矩阵一般是因为有某些液晶是采用纵向扫描显示法,为了提高显示速度,于是便把字库矩阵做成纵向,省得在显示时还要做矩阵转换。我们接下去所描述的都是指横向矩阵字库。

       对于16*16的矩阵来说,它所需要的位数共是16*16=256个位,每个字节为8位,因此,每个汉字都需要用256/8=32个字节来表示。  即每两个字节代表一行的16个点,共需要16行,显示汉字时,只需一次性读取32个字节,并将每两个字节为一行打印出来,即可形成一个汉字.

//解析16*16的点阵字库
public class Font16 {  private Context context;  public Font16(Context context) {  this.context = context;  }  private final static String ENCODE = "GB2312";  private final static String ZK16 = "HZK16";  private boolean[][] arr;  int all_16_32 = 16;  int all_2_4 = 2;  int all_32_128 = 32;  public boolean[][] drawString(String str) {  byte[] data = null;  int[] code = null;  int byteCount;  int lCount;  arr = new boolean[all_16_32][all_16_32];  for (int i = 0; i < str.length(); i++) {  if (str.charAt(i) < 0x80) {  continue;  }  code = getByteCode(str.substring(i, i + 1));  data = read(code[0], code[1]);  byteCount = 0;  for (int line = 0; line < all_16_32; line++) {  lCount = 0;  for (int k = 0; k < all_2_4; k++) {  for (int j = 0; j < 8; j++) {  if (((data[byteCount] >> (7 - j)) & 0x1) == 1) {  arr[line][lCount] = true;  System.out.print("@");  } else {  System.out.print(" ");  arr[line][lCount] = false;  }  lCount++;  }  byteCount++;  }  System.out.println();  }  }  return arr;  }  protected byte[] read(int areaCode, int posCode) {  byte[] data = null;  try {  int area = areaCode - 0xa0;  int pos = posCode - 0xa0;  InputStream in = context.getResources().getAssets().open(ZK16);  long offset = all_32_128 * ((area - 1) * 94 + pos - 1);  in.skip(offset);  data = new byte[all_32_128];  in.read(data, 0, all_32_128);  in.close();  } catch (Exception ex) {  }  return data;  }  protected int[] getByteCode(String str) {  int[] byteCode = new int[2];  try {  byte[] data = str.getBytes(ENCODE);  byteCode[0] = data[0] < 0 ? 256 + data[0] : data[0];  byteCode[1] = data[1] < 0 ? 256 + data[1] : data[1];  } catch (Exception ex) {  ex.printStackTrace();  }  return byteCode;  }  }  

 

 


http://www.ppmy.cn/news/853761.html

相关文章

不依赖字库的生成中文验证码的方法

jsp生成验证码的方法网上很多&#xff0c;但是很多都是依赖中英文字库&#xff0c;若是没有字库的话&#xff0c;生成出来的字会变为方块。 我写了一个显示中文验证码的程序&#xff0c;不依赖依赖字库&#xff0c;并且可以自己选择特有的图片作为验证码的文字。 我采取了把160…

自己编写的android汉字转拼音类(超全字库)

package com.phonecall; import java.util.HashMap; public class PinYin { private HashMap<String, String> PYmap new HashMap<>(); public PinYin() {//多个方法拼接载入&#xff0c;避免单个方法超过规定字节 loadToMap1(); loadToMap2(); loadToMap3(); l…

变体美术字设计手册

变体美术字设计手册 | 导语 变体美术字设计是字体设计里重要的一部分&#xff0c;因为其的多变性极高&#xff0c;相较于字库字体&#xff0c;变体美术字 给人们的印象更为深刻&#xff1b;这篇文章从定义&#xff0c;类别&#xff0c;基本笔画&#xff0c;笔画形状&#xff0c…

汉仪字库与中国美术学院字体设计工作站正式建立

作者:键盘手 浏览次数:8257 16/12/01 16:37 11月27日中国美术学院汉仪字体设计研究工作站(以下简称字体设计工作站)暨汉仪第三届字体之星设计大赛分享沙龙在杭州中国美术学院象山校区成功举办。

如何使用ShoeBox和PhotoShop制作出漂亮的Fnt字体

使用ShoeBox和PhotoShop制作漂亮的Fnt字体 在游戏中需要用到很多漂亮的字&#xff0c;但是herio制作出来的又不好看&#xff0c;所以本文用到了一个利器【ShoeBox】&#xff1a; 准备工作配置参数制作字体 - 游戏中使用 准备工作 ShoeBox [http://www.renderhjs.net/shoeb…

2022--SE-GAN骨架增强的基于gan的毛笔手写字体生成模型原理以及网络结构

文章目录 ABSTRACT1. INTRODUCTION2. RELATED WORK3. APPROACH3.1. Overall FrameworkSelf-attentive Refined Attention Module3.3. Discriminators3.4. Loss Design4. EXPERIMENTS4.1. Experimental Setup4.2. Experimental Results5. CONCLUSION AND FUTURE WORK6. REFERENC…

汉字风格迁移篇---个人手写体汉字字体的学习与生成*

文章目录 AbstractI. INTRODUCTIONII. METHODA. Classification NetworkB. Generating NetworkC. Discriminating NetworkD. OptimizationIII. EXPERIMENTSA. Data SetsB. Performance of Classification NetworkC. Baseline ModelIV. RESULTS AND DISCUSSIONSV. CONCLUSION AN…

adobe字体_可口可乐发布自己的字体!但是。。

LOGO大师整理编辑(ID&#xff1a;logods) 图片来源&#xff1a;方正字库&#xff0c;可口可乐大家还记得两年前可口可乐根据自家LOGO设计的 官方专属字体吗&#xff1f; (网友都说简直是良心饮料&#xff0c;好喝还有文化) 而就在昨天&#xff0c; 可口可乐134岁之际发出重磅福…