JavaME UI设计之点阵字体

用汉字库16X16实现输入文字和图片生成,像素文字图片。java,html 用汉字库16X16实现输入文字和图片生成,像素文字图片。 Java代码 代码详细说明: :获取指定汉字的点阵数据,并将其转换为 List 形式返回。 :从类路径中加载 HZK16 字库文件,将其读取为字节数组。 :根据汉字的 GB2312 编码计算该汉字在字库中的索引。 :根据索引从字库中提取汉字的点阵数据。 :将汉字的点阵字节数据转化为 16x16 的二维数组,表示汉字的点阵图。 :将二维数组转换为 List 形式。 :将 List 转换为带有换行符的字符串形式,方便 阅读详情
 
上一篇文章中我们介绍了在JavaME中实现Bitmap字体,但是要想通过Bitmap字体来显示中文几乎不太可能,除非你中文很少,也不介意这样做浪费时间,如果你想显示中文,又不想使用JavaME本身提供的字体,那么可以考虑使用点阵字,这就是本文将要给大家介绍的,如何在JavaME中使用点阵字库。
要在JavaME中使用点阵字,首先需要了解什么是点阵字,可以到各大百科互动网站找到相关介绍,这里就不耽误大家的时间了,点阵字实际上就是用画点的方式画出一个字。比如一个16*16的点阵字,它的每一个点占一位,一共是16*16,那么一个16的字所占大小是32byte。需要明白点阵字体优点是显示速度快,不像矢量字体需要计算;其最大的缺点是不能放大,一旦放大后就会发现文字边缘的锯齿,因此如果需要显示不同大小的点阵字,就需要准备不同大小的点阵字库。
点阵字库的制作方法也非常简单,网上有很多方法,本文我们选择使用HZK16字库来演示在JavaME如何使用点阵字库。
HZK16字库是符合GB2312标准的16× 16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用。HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。 我们知道一个GB2312汉字是由两个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)。下面以汉字“我”为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到“我”在hzk16库中的位置就必须得到它的区码和位码。
区码:区号(汉字的第一个字节)-0xa0(因为汉字编码是从0xa0区开始的,所以文件最前面就是从0xa0区开始,要算出相对区码)
位码:位号(汉字的第二个字节)-0xa0
这样我们就可以得到汉字在HZK16中的绝对偏移位置:
offset=(94*(区码-1)+(位码-1))*32
有了偏移地址就可以从HZK16中读取汉字编码了,下面我们就需要在JavaME中构建一个能够读取和显示点阵字库文字的类CustomFont,首先将我们准备的点阵字库HZK16放入工程的res文件夹中,并在CustomFont中标出该字库的路径和编码的等信息,如下代码所示。
public class CustomFont {
       public final static int[] mask = { 128, 64, 32, 16, 8, 4, 2, 1 };
       public final static String ZK_PATH = "/HZK16";
       public final static String ENCODE = "GB2312";
       //...
}
要读取一个汉字,我们首先要读取出汉字的区位码,通过如下代码可以读取出汉字的区位码:
/**
 *获得文字的区位码
 */
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) {
       }
       return byteCode;
}
然后通过区位码在字库中去查找文字信息,具体实现代码如下:
/**
 *读取文字信息
 *
 * @param areaCode
 *            区码
 *@param posCode
 *            位码
 *@return 文字数据
 */
protected byte[] read(int areaCode, int posCode) {
       byte[] data = null;
       try {
              int area = areaCode - 0xa0;// 获得真实区码
              int pos = posCode - 0xa0;// 获得真实位码
 
              InputStream in = getClass().getResourceAsStream(ZK_PATH);
              long offset = 32 * ((area - 1) * 94 + pos - 1);
              in.skip(offset);
              data = new byte[32];
              in.read(data, 0, 32);
              in.close();
       } catch (Exception ex) {
       }
       return data;
}
能从字库中读取出点阵字的信息,下面就是将这些数据绘制出来即可,绘制函数如下所示。
/**
 *绘制点阵中文汉字,gb2312,16字
 *
 * @param g
 *            画笔
 *@param str
 *            需要绘制的文字
 *@param x
 *            屏幕显示位置x
 *@param y
 *            屏幕显示位置y
 *@param color
 *            文字颜色
 *
 */
protected void drawString(Graphics g, String str, int x, int y, int color) {
       byte[] data = null;
       int[] code = null;
       int byteCount;// 到点阵数据的第几个字节了
       int lCount;// 控制列
       g.setColor(color);
       for (int i = 0; i < str.length(); i++) {
              if (str.charAt(i) < 0x80) {// 非中文
                     g.drawString(str.substring(i, i + 1), x + (i << 4), y, 0);
                     continue;
              }
              code = getByteCode(str.substring(i, i + 1));
              data = read(code[0], code[1]);
              byteCount = 0;
              for (int line = 0; line < 16; line++) {
              lCount = 0;
              for (int k = 0; k < 2; k++) {
                     for (int j = 0; j < 8; j++) {
                            if ((data[byteCount] & mask[j]) == mask[j]) {
                                   g.drawLine(x + lCount + (i << 4), y + line, x
                                   + lCount + (i << 4), y + line);
                            }
                     lCount++;
                     }
                     byteCount++;
              }
       }
}
完成了点阵字的读取和绘制操作,下面我们通过:
mCustomFont.drawString(g, "测试点阵字库的显示!好看多了。", 0, 20, 0xff0000);
来测试该自定义点阵字库在JavaME中的使用 ,效果如下图所示。
 

 
显示肯定没有问题,但是我们开发出来的应用程序包也就随之增加了很大,主要包括HZK16字库文件,另外,在使用过程中所需要消耗的内存也增加,因为一个16*16的汉字就需要32个字节,因此,对于应用中汉字较少的,可以采用自己制作出一些特定的点阵字的数组,然后进行绘制,可以节省不少空间。
关于JavaME中字体的处理就介绍到这里,几乎介绍了JavaME中所有与字体相关的内容,足以解决JavaME中大部分文字显示的难题了。


利用java开发点阵字体显示系(ASCII码字库的显示) 读取ASCII字库信息,并显示出来的完整代码。程序支持字符串输入,输出以*为信息的点阵信息图,如:I Love Java!显示如下 **** **** **** ** ** ** ** **** ** ** ** **** ** ** ***** ** ** ***** ** **** ** ** **** **** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ******* ** ***** ** ** ***** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **** ** ** ** ** ** ** **** ** ** ** **** ******* ***** ** ***** **** *** ** ** *** ** ** 立即下载

相关推荐

常用的几个字体库---ASC16、HZK16、HZK12,附HZK16的使用资料

常用的几个字体库---ASC16、HZK16、HZK12,附HZK16的使用资料

HZK16点阵字库程序

最近(很久之前的最近)在弄硬件,买了一块彩屏,需要字库,所以就把很久以前会的知识拿出来温习了一遍。果然好多都记忆模糊了。网上的代码我看过,很多都有问题,这里我帖出来的是我自己写的代码,没有问题。 HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首

walk_ing的博客 2442

中文字体库文件HZK16及其使用

中文字体库文件HZK16,以及在显示屏上打印中文字符的代码

【免费下载】 中文字体库文件HZK16及其使用

中文字体库文件HZK16及其使用 【下载地址】中文字体库文件HZK16及其使用 本仓库提供了一个中文字体库文件HZK16,以及在显示屏上打印中文字符的示例代码。HZK16是一个常用的16x16点阵中文字库文件,适用于嵌入式系统、单片机等场景中显示中文字符。 ...

gitblog_09810的博客 3598

汉字字库HZK16HZK24HZK32

包括HZK16黑体、HZK16楷体、HZK16宋体、HZK24黑体、HZK24楷体、HZK24宋体、HZK32宋体。

JAVA汉字字库及字模提取程序实现

实现在输入框输入一个汉字字符就能获取该汉字在HZK16里的字模数据

java生成点阵图_点阵字库在JAVA中的实现

前言:为什么要使用点阵字库在某些场合,系统自带的字库并不能令人满意,或者,在你需要特别的字体时,你希望能附带上该字库。那为什么又需要点阵字库呢?因为在使用较小的字体的时候,点阵字库能更清晰,同时,由于点阵字库并不包含路径等信息,因此,字库文件的大小也很小,便于携带。如何生成点阵字库在此,我并没有打算在此文中说明如何生成点阵字库,其实有很多现成的点阵字库可以选择,当然,目前都是使用 TrueType...

weixin_36451983的博客 1899

hzk16 12864 java_JAVA点阵_12864hzk16_HZK16JAVA_

1取汉字点阵数据2生成 纵向和字节倒序 字节,符合12864OLED LCD 显示。

JavaME UI设计之Bitmap字体

当我们使用 MIDP 的 Graphics 类,可以调用其 setFont() 来指定字体,然后调用该字体的一种 drawChar() 或 drawString() 方法来在 canvas 或后台图像上呈现字体。MIDP 仅提供了一套有限的字体选项,但是:字体可以是等宽的或成比例的,大小可以是小、中或大,并且样式可以是平铺或粗体、斜体和下划线的任意组合。运行库实现工具可能没有满足您的标准的字体,它

alleniversoncomputer的专栏 870

专题一:Labview表格控件 及 应用(三)在表格中插入一行数据

专题一:Labview表格控件 及 应用(三) 在表格中插入一行数据 最近一段时间,做试验台上位机编程,老是用到表格控件,这几天抽时间专门写一个表格控件的专题。有用到的朋友可以参考一下。 今天接着讲一下,表格控件的数据插入,和相关的操作 1.表格控件的数据插入原理: 表格控件是一个 2D 字符串数组。 在表格插入一行,就是在2D数组插入一行。 行、列插入类似** 以下以成绩录入为例说明 2.1 不要表头直接插入 知识点1:创建数组:把数学,语文,英语三个数值,连成一个一位数组(数值型)。 知

Labview十年工控_702老师的博客 1万+

Matlab使用GitHub的踩坑记录(持续更新)

Matlab使用git的踩坑记录前言Matlab设置Git的官方帮助文档系统配置新建Git两种代码管理方式典型源代码管理SVN分布式源代码管理 Git注意:SVN和Git都可以用GitHub创建新的库 前言 作为Git初学者,对Git的代码版本管理非常非常喜欢,给了我极大的安全感。特别是想到之前的几次Matlab、Latex和python的代码莫名其妙被折腾没了又没法找回的悲剧,决定慢慢的走入gi...

voluntry的博客 7296

Java调取16*16点阵HZK汉字库并打印点阵

Java读取汉字库

weixin_50088541的博客 1596

麒麟OS(Kylin OS)操作系统minikube+docker安装使用及遇到的问题

一 ,安装minikube及操作工具kubectl 1,安装kubectl 使用以下命令下载最新版本: curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" 要下载指定版本(例如v1.22.0版本) ,请键入: curl -LO https://dl.k8s.io/release/v1.22.0/bin/linux/amd..

qq_23396017的博客 2643

LED点阵字模提取学习

一、字模提取原理 无非就是从字库文件中读取出字模数据。 以常用的HZK16字库文件为例:该字库文件是符合GB2312国家标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。 一个字节为8bit,用一个bit位来表示点阵中的一个点的话,16×16点阵需要16*16/8 = 3...

fangye945a的博客 4415

【专栏导引贴】100+智能优化算法:从背景原理到代码实战(持续更新)

本专栏系统整理100+种现代优化算法,涵盖粒子群优化(PSO)、遗传算法(GA)、鲸鱼优化(WOA)等经典方法,以及白鲸优化(BWO)、非洲秃鹫优化(AVOA)等新兴算法。每篇详解包含生物启发原理、数学模型、代码实现及工程应用,采用统一编程风格,提供可直接运行的实例代码。专栏持续更新,旨在为研究者提供系统化的智能优化算法参考资料,实现从理论到实践的完整知识链。目前已收录23种算法,包括蚁群系统(ACS)、蝙蝠算法(BA)、天牛须搜索(BAS)等自然启发式优化方法。

qq_42212808的博客 3654

《Python星球日记》 第72天:问答系统与信息检索

《Python星球日记》 第72天:问答系统与信息检索,在前面的日子里,我们学习了自然语言处理的基础知识,包括文本预处理、词向量、Transformer架构和各种预训练模型。今天,我们将探索问答系统这一NLP的重要应用,以及如何结合信息检索技术构建智能问答系统。

Code_流苏:在代码中寻诗意,在实践中觅真知 1075

汉字库HZK16的简单介绍

注:该文章取自网络,作者无法考证,如果侵犯了著作权,请联系我HZK16 字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个, 符号682个。其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。 我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作 为己用。 HZK16字库里的16×16汉字一共

u014627430的博客 5017

linux内核学习(一)---内核社区介绍及补丁提交

本系列开始会对linux内核进行系统性的学习,以源码与内核社区为基础,了解前沿的内核机制,同时也深度了解linux内核中的一些经典机制 本章会先对linux内核社区进行简单的介绍,包括源码下载、内核社区的修改提交

文艺小少年的博客 536

点阵字体文件查看器 c#(HZK16)

在MCU项目中,准备自己写个简单的UI,在中文文字显示,打算选择 UCDOS 中的 HZK16,为了查看字体文件,用C#写了个简单的查看器,并导出数据为C语言数组。 OS:windows 2008 R2 standard (zh-cn) IDE:Microsoft Visual Studio Express 2012 for Windows Desktop - Microsoft Vi

的米-漠石's Blog 1万+

打通ZYNQ的任督二脉:AXI_FIFO数据交互全解析

FIFO(First In First Out,先进先出)是一种经典的数据缓冲结构,就像排队买票一样,先来的人先得到服务。时钟域交叉(CDC):连接不同时钟频率的模块数据缓冲:平衡生产者和消费者的速度差异流量控制:防止数据丢失或溢出input clk,// 输入AXI4-Stream接口(从PS到PL)// 输出AXI4-Stream接口(从PL到PS)// 状态指示信号// 定义状态机状态// 数据缓存// 8个深度的缓存// 流水线处理寄存器。

QQ_778132974的博客 306

108、AWB 时间滤波器:帧间白平衡平滑,防止色彩跳变与过冲

摘要: 文章探讨了AWB(自动白平衡)时间滤波器的设计与优化,以解决帧间白平衡跳变和过冲问题。通过自适应状态机(STABLE/TRANSITION/JUMP)动态调整平滑系数alpha,结合帧率归一化和过冲保护(方向检测+限幅),实现场景切换快速响应与静态稳定性的平衡。作者分享了工程经验:避免固定阈值、联动AE/AF、真实场景验证,并推荐简化卡尔曼滤波替代IIR。最终方案在旗舰机前置摄像头中成功消除“闪白”现象,强调参数需动态适应光照与色温变化。

sundong_81的博客 63

16*16点阵字库HZK16的使用

1.HZK16字库介绍 HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但

正在格式化…… 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux之汉字库HZK16

HZK16 GB2312简体中文编码表 http://wenku.baidu.com/view/0ef57bfb04a1b0717fd5dd1a.html HZK16字库是符合GB2312标准的16×16点阵字库.HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节

A7732285的博客 4483

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

免编译,运行单文件Java程序【JDK16+】

从JDK 11开始,Java引入了用Java启动器,可以直接运行一个单文件的Java源代码,运行前不需要对源代码进行显式的编译。原理很简单,Java启动器会自动调用编译器,并将编译好的字节码缓存在内存中。这种运行方式简化了编码-编译-运行的繁琐环节,可以让我们非常方便的学习Java,或者测试一些JavaAPI的新特性。接下来我们介绍几种Java启动器的使用方式和一些注意事项。

amos_cloud的博客 1342

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HZK16汉字16*16点阵字库的使用及实例程序

前言:最近有个关于泰国文字识别并打印的项目。之前对泰文的了解只听过“萨瓦迪卡”-_-!!,所以前两天在学习泰文的排版规范及unicode编码,了解之后开始学习文字点阵打印的原理及代码编写。今天学习了汉字16*16点阵字库的使用。 这里首先感谢陪她去流浪大佬的文章(这个大佬的id一听就是有女朋友的,羡慕o.o),文章简介明了、通俗易懂,代码讲解也非常的详细。 原理: HZK16字库是符合GB2312...

故事就酒的博客 3万+

使用HZK16字库文件提取文字并显示到OLED显示屏上(Java Android实现)

最近在做要把文字(英文、汉字)显示到OLED显示屏上这方面内容,英文还好说,无非几十个字符,网上一搜也都有现成的方法。但汉字可就比较棘手了,首先要实现汉字的显示需要知道这个汉字的字模,这个我们可以很轻松地使用取字模软件获取(下边有下载地址),这样其实就可以了。棘手的是如果我要取得任意汉字的字模呢?不可能把所有字模的信息都生成吧!但是如果用到哪个生成哪个很明显扩展性不高也非常麻烦。这时我们就想到了使

breeze_wf的专栏 1万+
上一篇: JavaME UI设计之资源优化技巧
下一篇: JavaME UI设计之Bitmap字体
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值