GBK字库制作、字模数据读取、使用

5 篇文章 0 订阅

最近因为工作需要,学习了一下GBK相关的知识,关于gbk的介绍请参照http://blog.sina.com.cn/s/blog_49677f890102w51b.html。


本文从三个小方面来讲述一下gbk的学习-gbk字库的制作;从gbk字库中读取某一个汉字的字模数据;利用字模数据打印出汉字


1、gbk字库的制作(感谢战舰)

相关软件下载:http://download.csdn.net/detail/scalerzhangjie/9545477

软件配置如下所示,点击创建后提示输入文件名称,之后就会生产gbk字库文件(大小是766080字节)。


如果嫌麻烦,可以直接到如下网址下载:

http://download.csdn.net/detail/scalerzhangjie/9545480

(字库名称为:GBK.DZK,下文会用到)



2、从gbk字库中读取某一个汉字(苹)的字模数据

代码如下:

#include <sys/stat.h>
#include <stdio.h>

#define FILE_NAME "GBK.DZK"
#define STR_HZ "苹"

int get_gbk_offset(char * hz_code)
{
	unsigned char high = hz_code[0];
	unsigned char low = hz_code[1];

	printf("high:%x, low:%x\n", high, low);
	
	if (low < 0x80)
	{
		return ((high-0x81)*190 + (low-0x40))*32;
	}
	else
	{
		return ((high-0x81)*190 + (low-0x41))*32;
	}
}

unsigned char gbk_hz_buf[100000000];

long file_size(const char *file)
{
	int i = 0;
	int offset = 0;
    long length = -1;
    FILE *fp = fopen(file, "rb+");
    if (fp == NULL) {
        return length;
    }

    fseek(fp, 0, SEEK_END);
    length = ftell(fp);	

	rewind(fp);

	fread(gbk_hz_buf, 1, length, fp);

	offset = get_gbk_offset(STR_HZ);

	for (i = 0; i < 32; i++)
	{
		printf("0x%x, ", gbk_hz_buf[offset+i]);

		if ((i+1)%4 == 0)
		{
			printf("\n");
		}
	}

	printf("\n");

    fclose(fp);
    return length;
}

void main(void)
{
	long size = 0;
	
	size = file_size(FILE_NAME);

	return ;
}


运行结果如下:


可知“苹”对应的字模数据是:

0x8, 0x20, 0x8, 0x20,0xff, 0xfe, 0x8, 0x20,0x0, 0x0, 0x7f, 0xfc,0x1, 0x0, 0x11, 0x10,
0x9, 0x10, 0x9, 0x20,0x1, 0x0, 0xff, 0xfe,0x1, 0x0, 0x1, 0x0,0x1, 0x0, 0x1, 0x0。


3、利用字模数据打印出汉字

程序如下:

#include <sys/stat.h>
#include <stdio.h>

unsigned char Hz_code[] = {
0x8, 0x20, 0x8, 0x20,
0xff, 0xfe, 0x8, 0x20,
0x0, 0x0, 0x7f, 0xfc,
0x1, 0x0, 0x11, 0x10,
0x9, 0x10, 0x9, 0x20,
0x1, 0x0, 0xff, 0xfe,
0x1, 0x0, 0x1, 0x0,
0x1, 0x0, 0x1, 0x0
};

#define RIGHT_SHIFT_VAL(x, n) (((x)>>(n)) & 0x01)

void prt_one_Hz(void)
{
	int tbl_size = sizeof(Hz_code)/sizeof(char);
	short int temp_code = 0;
	int i = 0, j = 0;

	for (i = 0; i < tbl_size; i+=2)
	{
		temp_code = Hz_code[i]<<8 | Hz_code[i+1];

		for (j = 16; j > 0; j--)
		{
			if (RIGHT_SHIFT_VAL(temp_code, j-1))
			{
				printf("●");
			}
			else
			{
				printf("○");
			}
		}

		printf("\n");
	}
}

void main(void)
{
	prt_one_Hz();
	return ;
}
运行结果如下:




示例较简单,仅作入门参考。

目前遇到的一个问题,生成的字库在linux下面用不了,fopen打不开,原因待查。

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
在Matlab中调用字库生成字模的过程主要分为以下几个步骤: 1. 导入字库文件:首先需要将字库文件导入到Matlab中。字库文件是包含各个字符的图像或矢量描述的文件,通常是以图片或者文件格式如ttf、otf等保存的。可以使用Matlab提供的相关函数或者工具箱来完成导入操作。 2. 选择字体和字号:在生成字模之前,需要选择要使用的字体和字号。可以通过设置相关参数来指定要使用的字体和字号,也可以通过Matlab提供的字体管理函数来获取系统或已安装字库中的可用字体和字号。 3. 生成字模:根据所选的字体和字号,可以使用Matlab提供的图像处理函数或字模生成工具箱来生成字模。具体的生成方式取决于字库文件的格式和内容。如果字库文件已经是包含各个字符图像的文件,可以直接将图像数据读取到Matlab中,然后针对每个字符进行处理以生成字模。如果字库文件是矢量描述的文件,则可以使用字模生成工具箱提供的相关函数将矢量描述转换为字模图像。 4. 调用字模:生成的字模可以以图像或矩阵的形式保存在Matlab中。可以根据实际需要使用这些字模,如进行字符识别、字符渲染等操作。根据字模的保存格式和使用方式,可以通过Matlab提供的图像处理函数或者矩阵操作函数来调用使用字模。 在实际操作中,可以根据具体需求选择合适的方法和工具箱进行字模的生成和调用,例如使用Matlab的Image Processing Toolbox进行图像处理、使用Computer Vision Toolbox进行字符识别等。另外,如果需要将字模应用于其他编程语言或外部设备,还需要将生成的字模数据进行导出和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_baba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值