最近有个需求要取汉字的字模,但是大部分都是C++\Delphi的实现,参考其他范例也实现了一个Delphi取模的方法,但感觉不是非常方便,尤其是在文字的缩放,变形的方面。JAVA里面图片处理的类貌似非常方便,于是也想对照写了一个测试类,非常好用。
基本思路:根据汉字字体等参数将汉字绘到64X64的图层上,然后分将该图层分成很想16X16的图片。然后对每个图片上的每个像素点取值相加,如果大于阀值则标记该点。这样循环取出16X16的点阵。具体实现的时候可以根据实际需要将图层分辨率、取模比例等进行调整,并且也可以使用JAVA的图像处理方法对汉字进行缩放等。本类中只实现了对汉字的横向、纵向缩放。下面是实现类:
package com.strong;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class JavaZiMo {
private static int intKuan = 64;
private static int intGao = 64;
private static int intSuoFangKuan = 1; // 横向缩放比例如 1.01 0.9
private static int intSuoFangGao = 1; // 纵向缩放比例如 1.01 0.9
private static int intFaZhi = -16; // 显示阀值
private static String strShuRu = "胡"; // 待取字模
private static String strZiTi = "文泉驿正黑"; // 待取字体
public JavaZiMo() {
}
public static void main(String[] args) {
BufferedImage image = new BufferedImage(intKuan, intGao, BufferedImage.TYPE_INT_BGR);
Graphics2D g = image.createGraphics();
Font myFont = new Font(strZiTi, Font.BOLD, 64); // 定义字体样式
g.setFont(myFont); // 设置字体
g.fillRect(0, 0, intKuan, intGao); // 绘制背景
g.setColor(new Color(0, 0, 0)); // 设置字体颜色
g.scale(intSuoFangKuan, intSuoFangGao); // 设置缩放
g.drawString(strShuRu, 0, 54);
g.dispose();
// 生成图片文件
// File f1 = new File("/tmp/11.jpg");
// try {
// ImageIO.write(image, "JPG", f1);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
BufferedImage bi[] = new BufferedImage[16 * 16];
int intDianZhen[] = new int[16 * 16];
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
bi[i * 16 + j] = image.getSubimage(i * 4, j * 4, 4, 4);
}
}
for (int i = 0; i < bi.length; i++) {
int intD = 0;
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
intD += bi[i].getRGB(j, k);
}
}
intDianZhen[i] = intD;
}
// intDianZhen是实际的像素值数组,为了方便使用下面再用一个循环取字模,实际可以和上面合并
for (int i = 0; i < 16; i++) {
StringBuffer sb = new StringBuffer();
for (int j = 0; j < 16; j++) {
if (intDianZhen[i + j * 16] < intFaZhi) {
sb.append("■");
} else {
sb.append("-");
}
}
System.out.println(sb.toString());
}
}
}
运行后在控制台输出如下:
----■■----------
----■■---■■■■■■■
----■■---■■■■■■■
■■■■■■■■■■■--■■■
■---■■--■■■--■■■
----■■---■■■■■■■
----■■---■■--■■■
--■■■■■■-■■--■■■
--■■--■■-■■■■■■■
--■■--■■-■■■■■■■
--■■--■■-■■--■■■
--■■■■■■■■■--■■■
--■■--■■■■■--■■■
--■■--■■■■---■■■
-----■■■■--■■■■■
------■■----■■--
分享到:
相关推荐
JAVA 汉字字库及字模提取程序实现 本篇文章旨在介绍JAVA语言实现汉字字库及字模提取程序的设计和实现。该程序的主要功能是从汉字字库中提取汉字的字模数据, 并将其显示在LED显示屏上。下面将详细介绍该程序的实现...
5. **打印服务类**:创建一个Java类,封装打印机的初始化、发送数据、关闭连接等操作,提供统一的接口供其他业务逻辑调用。 6. **异常处理**:由于硬件可能出现故障,Java程序需要有良好的错误处理机制,如超时重试...
2. **编写Java代码**:创建Java类,使用JNI或者第三方Java库(如JNA - Java Native Access)来封装`ts24.lib`的函数调用。这些函数可能包括初始化打印机、设置打印参数、发送打印命令等。 3. **处理24点阵字库**:...
这部分代码可能包括Java测试类和对应的C/C++测试函数,用于确保在不同场景下,JNI接口的调用和数据传递都正确无误。 这个Demo项目对于理解Android应用中如何利用FreeType库进行字体处理,以及掌握JNI和NDK开发有很...
总结起来,全国计算机等级考试1级主要测试考生对于计算机基础知识的理解和应用,包括计算机体系结构、二进制数学、编程语言原理、操作系统、数据存储、网络安全和软件分类等基本概念。理解和掌握这些知识点对于日常...