需要注意:
1.HZK24字库中的byte数组需要按列扫描打印,即从最左边的列开始,每列三个byte,共24列。
2.24x24点阵的寻址公式与16x16稍有不同,需要区码多减去16
package tools;
import org.springframework.core.io.ClassPathResource;
import java.io.IOException;
import java.io.InputStream;
public class point24 {
public static void main(String[] args) throws IOException {
String str = "你";
byte[] cbuf = new byte[72];
byte[] bytes = str.getBytes("GB2312");
System.out.println(bytes[0]);
//这种写法是把byte转成int的
int segNum = bytes[0] & 0xff;
int bitNum = bytes[1] & 0xff;
//算出这个字在字库文件中的偏移量,注意32是表示16*16像素的字站32个字节
/*int offset = (94 * (segNum - 0xb0) + (bitNum - 0xa1)) * 72;*/
int offset = (94 * (segNum - 0Xaf - 1) + (bitNum - 0xa0 - 1)) * 72;
System.out.println("offset = " + offset);
//读取点阵字库文件,需要按需修改为你电脑上实际字库的绝对地址
ClassPathResource classPathResource = new ClassPathResource("HZK24H");
InputStream inputStream = classPathResource.getInputStream();
//跳过offset个字节,读取汉字占用的72个字节
inputStream.skip(offset);
inputStream.read(cbuf);
int[][] arr = new int[24][24];
for (int i = 0; i<24; i++) {
for (int j = 0; j<3; j++) {
for (int k = 0;k<8; k++) {
int flag = cbuf[i * 3 + j] & (0x80 >> k);
if ( flag>0)
arr[j * 8 + k][i] = 1 ;
else
arr[j * 8 + k][i] = 0 ;
}
}
}
for (int i=0;i<24;i++){
for (int j=0;j<24;j++){
/*System.out.print(arr[i][j]);*/
System.out.print(arr[i][j] == 0 ? "○" : "●");
}
System.out.println();
}
//转换为行扫描的byte[]
/* String[] byte_str =new String[72];
byte[] byte_24 = new byte[72];
for (int i=0;i<24;i++){
for (int j=0;j<3;j++){
String str_mid = "";
for (int k=0;k<8;k++){
str_mid += arr[i][j*8+k] ;
}
byte_str[i*3+j] = str_mid;
}
}
for (int i=0;i<72;i++){
byte_24[i] = (byte) (Integer.parseInt(byte_str[i],2) & 0XFF);
System.out.println(byte_str[i]);
System.out.println(byte_24[i]);
}*/
}
}