返回顶部
首页 > 资讯 > 后端开发 > Python >python HZK16字库如何使用
  • 681
分享到

python HZK16字库如何使用

2023-07-05 05:07:31 681人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“python HZK16字库如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介偶然在网上看到热心网友使用P

本篇内容介绍了“python HZK16字库如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

简介

偶然在网上看到热心网友使用Python微信头像进行了组字,感觉很有意思,就做下研究。

感谢,原文参考自: Python玩微信头像组字

需求的相关工具

python第三方库image

pip install image      # 图像处理

HZK16字库的下载

自行百度下载吧,由于网盘链接失效暂不给大家分享了。

本应该要安装python的第三方库itchat

pip install itchat     # 开源的微信个人接口# 腾讯在2019年7月份关闭了网页版登录接口# itchat的相关接口已经不能够正常使用了,原有使用的主要接口有:# 自动登录微信网页,会生成一个二维码图片,手机扫码即可登入itchat.auto_login()# 获取微信好友信息列表,从而获取头像信息friendList = itchat.get_friends(update=True)

实现的原理:

通过itchat获取微信好友头像图片,将设定的文字按照HZK16字库转换为矩阵信息,然后在每个矩阵点上放置2X2张图片,最后通过Image生成出来。

虽然itchat不可使用了,但是我们可以使用本地的图片进行模拟效果.

HZK16简介

它是符合GB2312国家标准的16×16点阵字库,每个汉字需要**256(16×16)**个点组成。

其GB2312-80支持的汉字有6763个,符号682个;其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。

通常情况下中文汉字,在UTF-8格式下占用字节为2个;在GBK,GB2312格式下占用字节3个。因此GB2312的HZK16下的中文汉字占用2个字节。其编码范围:0xA1A1~0xFEFEA1-A9为符号区,B0-F7为汉字区。

前面说到GB2312格式下汉字占2个字节,前一个字节为该汉字的区号,每个区中记录94个汉字;后一个字节为该字的位号。用于记录汉字在该区中的位置。

因此要找到一个汉字在HZK16字库中的位置就必须得到它的区码和位码。

  • 区码:汉字的第一个字节 - 0xA0,因为汉字编码是从0xA0区开始的,所以文件最前面就是从0xA0区开始,要算出相对区码

  • 位码:汉字的第二个字节 - 0xA0

通过区码和位码我们就可以得到汉字在HZK16中的绝对偏移位置:

'''* 区码或者位码减1,是由于数组从0开始,而区号位号是以1开始* (94*(区号-1)+位号-1)是一个汉字字模占用的字节数* 乘以32是因为一个汉字由32个字节存储(16*16/8)'''offset = (94*(区码-1)+(位码-1))*32

案例:

下载HZK16文件后,放置到指定的目录中,其目录结构为:

python HZK16字库如何使用

res中放置着一张75X75的png图片,可放置多个。代码为:

# -*- coding:UTF-8 -*-#!/usr/bin/env pythonimport osimport mathimport binasciifrom PIL import Image# 用于解决错误:UnicodeEncodeError: 'ascii' codec encode characters in position...# 原因在于调用ascii编码处理字符流时,若字符流不属于ascii范围内就会报错import sysreload(sys)sys.setdefaultencoding('utf-8')# 每张头像裁剪后尺寸,建议图片不要太大,最好宽高一致HEAD_CLIPSIZE = 75# 每行列头像数目,即每点:2*2,可修改为3,即3*3HEAD_NUM = 2RECT_WIDTH = 16                                         # 矩阵点宽度 16             RECT_HEIGHT = 16                                        # 矩阵点高度 16BYTE_COUNT_PER_FONT = 2*RECT_HEIGHT                     # 占用字节 32# 将文字转换为点阵def char2bit(textStr):    KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]    target = []    global count    count = 0    # 遍历文字    for x in range(len(textStr)):        text = textStr[x]        # 初始化16*16点阵位置        rect_list = [] * RECT_WIDTH        for i in range(RECT_HEIGHT):            rect_list.append([] * RECT_WIDTH)        # 获取GB2312编码字符        gb2312 = text.encode('gb2312')        hex_str = binascii.b2a_hex(gb2312)        result = str(hex_str)        # 获取汉字第一个字节,区码        area = eval('0x' + result[:2]) - 0xA0               # 获取汉字第二个字节,位码            index = eval('0x' + result[2:]) - 0xA0        # 获取汉字在字库中的绝对偏移值        offset = (94 * (area-1) + (index-1)) * BYTE_COUNT_PER_FONT        font_rect = None        # 读取HZK16字库文件        with open("HZK16", "rb") as f:            # 获取目标汉字偏移位置            f.seek(offset)            # 从数据中读取32字节数据            font_rect = f.read(BYTE_COUNT_PER_FONT)        for k in range(len(font_rect)/2):            row_list = rect_list[k]            for j in range(2):                for i in range(8):                    asc = binascii.b2a_hex(font_rect[k * 2 + j])                    asc = asc = eval('0x' + asc)                    flag = asc & KEYS[i]                    row_list.append(flag)        output = []        _str = ''        for row in rect_list:            for i in row:                if i:                    output.append('1')                    _str += '0'                    count+=1                else:                    output.append('0')                    _str += '.'            print(_str)            _str = ''        target.append(''.join(output))    return targetdef head2char(index, outlist):    # 获取资源列表    imgList = []    workspace = os.getcwd()    respath = os.path.join(workspace, 'res')    for root, dirs, files in os.walk(respath):        for filename in files:            imgList.append(os.path.join(root, filename))    # 图片数目    imGCount = len(imgList)    #变量n用于循环遍历头像图片,即当所需图片大于头像总数时,循环使用头像图片    n = 0    for item in outlist:        # 创建新图片        canvasWidth = RECT_WIDTH * HEAD_NUM * HEAD_CLIPSIZE        canvasHeight = RECT_HEIGHT * HEAD_NUM * HEAD_CLIPSIZE        canvas = Image.new('RGB', (canvasWidth, canvasHeight), '#E0EEE0')        # 遍历 RECT_WIDTH * RECT_HEIGHT 矩阵        for i in range(RECT_WIDTH * RECT_HEIGHT):            #点阵信息为1,即代表此处要显示头像来组字            if item[i] != '1':                continue             # 每个点使用放置几个矩阵,比如2*2,3*3            for count in range(pow(HEAD_NUM, 2)):                # 获取图片索引                imgIndex = (n + count) % imgCount                # 读取图片                          headImg = Image.open(imgList[imgIndex])                  # 重置图片大小                       headImg = headImg.resize((HEAD_CLIPSIZE, HEAD_CLIPSIZE), Image.ANTIALIAS)                # 拼接图片                posx = ((i % RECT_WIDTH) * HEAD_NUM + (count%HEAD_NUM)) * HEAD_CLIPSIZE                posy = ((i // RECT_HEIGHT) * HEAD_NUM + (count//HEAD_NUM)) * HEAD_CLIPSIZE                canvas.paste(headImg, (posx, posy))            #调整n以读取后续图片            n = (n+4) % imgCount        # 保存图片 quality代表图片质量,1-100        canvas.save('result_{0}.jpg'.fORMat(index), quality=100)# 将gbk转换为unicode格式def transGbk2Unicode(str_v):    str_s = str_v.replace(r'%', r'\x')    res = eval(repr(str_s).replace('\\\\', '\\'))    return res.decode('gb2312')        if __name__=="__main__":    inputStr = u'请输入您想要生成的文字(ENTER结束):'    # 输入内容,将中文从unicode转换为gbk,防止乱码    content = raw_input(inputStr.encode('gbk'))    # 将gbk转换为unicode,以方便遍历时能够遍历每个文字或字母    content = transGbk2Unicode(content)    print(u'注意:指定文字每个仅能生成一个')    # 循环遍历    index = 0    for _str in content:        print(u'生成汉字:' + _str)        #将字转化为汉字库的点阵数据        outlist = char2bit(_str)        #将头像图片按点阵拼接成单字图片                                   head2char(index, outlist)        index += 1    print(u'生成成功!!!')

执行结果:

python HZK16字库如何使用

python HZK16字库如何使用

“python HZK16字库如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: python HZK16字库如何使用

本文链接: https://lsjlt.com/news/349670.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python HZK16字库如何使用
    本篇内容介绍了“python HZK16字库如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介偶然在网上看到热心网友使用p...
    99+
    2023-07-05
  • python HZK16字库使用详解
    目录简介实现的原理:HZK16简介案例:环境: windows7, python2.7 简介 偶然在网上看到热心网友使用python讲微信头像进行了组字,感觉很有意思,就做下研究。 ...
    99+
    2023-02-22
    python HZK16字库 python HZK16字库使用
  • python如何使用progressbar库
    小编给大家分享一下python如何使用progressbar库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!progressba...
    99+
    2024-04-02
  • python如何使用PySimpleGUI库
    这篇文章给大家分享的是有关python如何使用PySimpleGUI库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PySimpleGUI库PySimpleGUI也是一种动态进度...
    99+
    2024-04-02
  • Python如何使用Numpy库
    这篇文章主要为大家展示了“Python如何使用Numpy库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python如何使用Numpy库”这篇文章吧。Numpy库介绍numpy 库处理的最基础数...
    99+
    2023-06-25
  • python random库如何使用
    Python的random库提供了生成随机数的函数,可以用于生成随机数、随机选择等操作。以下是一些常见的使用方法: 生成随机整数:...
    99+
    2024-02-29
    python
  • Python中字典如何使用
    这期内容当中小编将会给大家带来有关Python中字典如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python字典应用方式1)get(key,default=None) 返回键值key对应的值;如...
    99+
    2023-06-17
  • Python中如何使用Itertools库
    这篇文章将为大家详细讲解有关Python中如何使用Itertools库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、概念简介1. 什么是迭代器迭代器是由__next__方法组成的对象。它...
    99+
    2023-06-16
  • Python中如何使用ChatOps库
    Python中如何使用ChatOps库,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。ChatOps 是基于会话导向而进行的开发。其思路是你可以编写能够对聊天窗口中的某些输入...
    99+
    2023-06-16
  • Python中如何使用NumPy库?
    NumPy是Python中最流行的科学计算库之一。它提供了一种高效的处理大型数组和矩阵的方法,同时也包含了许多用于数学、科学和工程计算的常用函数。本文将介绍NumPy库的基础知识以及如何使用它来进行数组和矩阵操作。 安装NumPy 在...
    99+
    2023-09-26
    api numpy spring
  • Python的tkinter库如何使用
    要使用Python的tkinter库,首先需要导入该库:```import tkinter as tk```然后,可以创建一个Tk对...
    99+
    2023-09-27
    Python tkinter
  • python的socket库如何使用
    Python的socket库是用于网络通信的标准库,可以进行网络编程。下面是一个使用socket库的简单示例:```pythonim...
    99+
    2023-10-10
    python socket
  • python中如何使用numpy库
    这篇文章主要介绍“python中如何使用numpy库”,在日常操作中,相信很多人在python中如何使用numpy库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中如何使用numpy库”的疑惑有所...
    99+
    2023-06-27
  • python的pandas库如何使用
    Pandas 是一个用于数据处理和分析的 Python 库,可以帮助用户轻松地进行数据清洗、转换、分析和可视化等操作。下面是一个简单...
    99+
    2023-10-19
    python
  • python中如何使用Matplotlib库
    这篇文章将为大家详细讲解有关python中如何使用Matplotlib库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Matplotlib是一个Python 2D绘图库,可以生成各种硬拷贝格式和跨平台交互...
    99+
    2023-06-02
  • Python的time库如何使用
    本篇内容介绍了“Python的time库如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.时间戳时间戳1970.1.1到指定时间到间...
    99+
    2023-06-30
  • Python中jieba库如何使用
    这篇文章主要介绍“Python中jieba库如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中jieba库如何使用”文章能帮助大家解决问题。一、jieba库基本介绍(1)jieba...
    99+
    2023-07-05
  • python random库如何使用demo
    本篇内容主要讲解“python random库如何使用demo”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python random库如何使用demo”吧!python r...
    99+
    2023-07-05
  • 如何使用python的gradio库
    这篇文章主要介绍了如何使用python的gradio库的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用python的gradio库文章都会有所收获,下面我们一起来看看吧。Gradio是一个功能丰富的Pyt...
    99+
    2023-07-06
  • python的ffmpeg库如何使用
    要使用Python中的FFmpeg库,可以使用ffmpy库或subprocess库。 使用ffmpy库的示例代码如下: from f...
    99+
    2024-02-29
    python ffmpeg
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作