`

java中点阵字库的解析

    博客分类:
  • java
 
阅读更多

最近研究点阵字库的展示,搜到很多东西,而且大多都是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;  
    }  
  
}  

 

 

分享到:
评论

相关推荐

    多国语言开发必备工具(点阵字库+多国语言文本管理+MTK 字库+字库解析源码 c)

    修改了 Example 中点阵字库解析源码,更加便于移植。(基本做到只需修改font_file.c 即可) 2. 修改了内码(MBCS)字库点阵信息读取的一个错误。 3. 增加了多语言支持(简中,英文),还有待完善。。。 V1.02 (07/...

    中点画圆法画圆

    在计算机图形学中,"中点画圆法"是一种经典的算法,用于在屏幕上精确地绘制圆形。这种方法基于欧几里得几何中的圆定义,即所有到圆心等距离的点都在同一圆上。中点画圆法的核心在于通过迭代计算每次移动到下一个像素...

    java图形学中点扫描算法画圆

    在Java图形学中,点扫描算法(Bresenham's Line Algorithm)通常被用来绘制直线,但通过一些扩展,我们也可以用它来绘制圆形。点扫描算法的核心思想是基于错误修正,逐步决定应该在屏幕上画点还是不画点,以尽可能...

    java计算机图形学中点扫描算法画圆

    Java作为一种广泛应用的编程语言,提供了丰富的图形库,如JavaFX和AWT,使得开发者能够创建出复杂的图形界面。本主题聚焦于使用点扫描算法(Bresenham's Circle Algorithm)在Java环境中绘制圆形。这是一种效率高且...

    中点画圆法画圆源代码学习

    本主题主要聚焦于使用Java语言实现中点画圆法的源代码学习。 中点画圆法基于几何原理,它通过迭代计算来逼近圆的边缘。算法的核心思想是,从圆心出发,通过不断调整半径长度,使画出的像素点始终与圆心的距离相等。...

    JAVA实现 中点画线算法、Bresenham画线算法

    本资源提供了两种经典的Java实现:中点画线算法和Bresenham画线算法。这两种算法都解决了像素化画线的问题,使得在有限精度的数字设备上能够精确地描绘出连续的线条。 **中点画线算法** 是一种基于几何原理的算法,...

    最新unicode点阵字库生成工具(fontmaker)

    修改了 Example 中点阵字库解析源码,更加便于移植。(基本做到只需修改font_file.c 即可) 2. 修改了内码(MBCS)字库点阵信息读取的一个错误。 3. 增加了多语言支持(简中,英文),还有待完善。。。 V1.02 ...

    Java中点bresanham画圆

    Java中的Bresenham算法是一种用于绘制几何图形的高效算法,尤其适用于在像素化环境中,如计算机图形学或GUI编程。这个算法最早由James W. Bresenham于1965年提出,用于在低分辨率的显示设备上近似地绘制直线。然而,...

    java采用中点Bresenham算法画椭圆

    java采用中点Bresenham算法画椭圆

    解析几何系列小专题2- 中点弦【解析版】.pdf

    本文讨论了与椭圆相关的中点弦问题,以及如何通过解析几何的方法求解相关问题。 椭圆是所有到两个固定点(焦点)距离之和为常数的点的集合。对于标准位置的椭圆,其方程可以表示为 \(\frac{x^2}{a^2} + \frac{y^2}{...

    SuperMap Objects Java 扇区中点连线

    本范例主要关注的是使用SuperMap Objects Java实现扇区(Sector)符号的中点连线功能。这个功能在地图可视化、专业制图以及数据分析中都有广泛应用。 首先,我们要理解什么是扇区符号。扇区通常代表角度或圆的一...

    中点画圆,Bresenham画圆,中点画椭圆java源码

    在Java源码中,`MidPointCircle.java`文件可能会包含一个名为`drawCircle`的函数,它接受圆心的x和y坐标以及半径作为参数,然后利用中点画圆算法来填充或描边圆形。 接着,Bresenham画圆算法是另一种高效的画圆方法...

    计算机图形学DDA画直线,中点画直线,Bresenham画直线java程序

    本文将深入探讨三种经典的直线绘制算法:DDA(Digital Differential Analyzer),中点画直线算法以及Bresenham算法,并结合Java编程语言来解释其实现原理。 1. DDA算法: DDA,即数字微分分析器,是一种简单的直线...

    计算机图形学中点画圆Java实现

    这是用JAVA语言编写的 public DrawCircleFrame() public void MidPointCircle(int r)

    字库工具 guitool(Trial) Setup 1.13.rar

    * 修改了 Example 中点阵字库解析源码,更加便于移植。(基本做到只需修改font_file.c 即可) * 修改了内码(MBCS)字库点阵信息读取的一个错误。 + 增加了多语言支持(简中,英文),还有待完善。。。 V1.02 (07/...

    java图形学中点画线法

    在Java图形学中,点画线法是一种基本的算法,用于在屏幕上绘制直线。这个算法是基于计算机图形学的基本原理,通常用于二维图形渲染。在本文中,我们将深入探讨点画线法,包括其原理、实现步骤以及如何在Java中应用。...

    解析乱码的JAVA程序

    经常在读取数据库或者JSP的时候出现乱码,可能很难猜测乱码是什么编码格式的。把乱码贴到这个程序中点解码,程序会用所有选中的字符集对乱码解码,再重新编码。最终得到一些内容,并显示解开乱码的方案。

    计算机图形学 中点画线程序代码 java语言

    用java语言写的计算机图形中点画线算法

    中点分割裁剪算法

    《中点分割裁剪算法详解》 在计算机图形学领域,中点分割裁剪算法是一种常用的二维几何图形裁剪方法,尤其在OpenGL等图形库中应用广泛。该算法主要用于处理线段与窗口(通常为矩形)之间的裁剪问题,确保在有限的...

    基于java使用DDA、Bresenham算法、中点画圆和椭圆、来实可视化界面画线功能

    本项目是基于Java实现的,利用了DDA(Digital Differential Analyzer,数字微分分析器)、Bresenham算法以及中点画圆和椭圆的方法,来创建一个可视化界面,实现了在界面上动态绘制线条、圆形和椭圆的功能。...

Global site tag (gtag.js) - Google Analytics