python HZK16字库如何使用(python,开发技术)

时间:2024-05-09 11:39:37 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

简介

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

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

需求的相关工具:

python第三方库image

pipinstallimage#图像处理

HZK16字库的下载

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

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

pipinstallitchat#开源的微信个人接口#腾讯在2023年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/envpythonimportosimportmathimportbinasciifromPILimportImage#用于解决错误:UnicodeEncodeError:'ascii'codecencodecharactersinposition...#原因在于调用ascii编码处理字符流时,若字符流不属于ascii范围内就会报错importsysreload(sys)sys.setdefaultencoding('utf-8')#每张头像裁剪后尺寸,建议图片不要太大,最好宽高一致HEAD_CLIPSIZE=75#每行列头像数目,即每点:2*2,可修改为3,即3*3HEAD_NUM=2RECT_WIDTH=16#矩阵点宽度16RECT_HEIGHT=16#矩阵点高度16BYTE_COUNT_PER_FONT=2*RECT_HEIGHT#占用字节32#将文字转换为点阵defchar2bit(textStr):KEYS=[0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01]target=[]globalcountcount=0#遍历文字forxinrange(len(textStr)):text=textStr[x]#初始化16*16点阵位置rect_list=[]*RECT_WIDTHforiinrange(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_FONTfont_rect=None#读取HZK16字库文件withopen("HZK16","rb")asf:#获取目标汉字偏移位置f.seek(offset)#从数据中读取32字节数据font_rect=f.read(BYTE_COUNT_PER_FONT)forkinrange(len(font_rect)/2):row_list=rect_list[k]forjinrange(2):foriinrange(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=''forrowinrect_list:foriinrow:ifi:output.append('1')_str+='0'count+=1else:output.append('0')_str+='.'print(_str)_str=''target.append(''.join(output))returntargetdefhead2char(index,outlist):#获取资源列表imgList=[]workspace=os.getcwd()respath=os.path.join(workspace,'res')forroot,dirs,filesinos.walk(respath):forfilenameinfiles:imgList.append(os.path.join(root,filename))#图片数目imgCount=len(imgList)#变量n用于循环遍历头像图片,即当所需图片大于头像总数时,循环使用头像图片n=0foriteminoutlist:#创建新图片canvasWidth=RECT_WIDTH*HEAD_NUM*HEAD_CLIPSIZEcanvasHeight=RECT_HEIGHT*HEAD_NUM*HEAD_CLIPSIZEcanvas=Image.new('RGB',(canvasWidth,canvasHeight),'#E0EEE0')#遍历RECT_WIDTH*RECT_HEIGHT矩阵foriinrange(RECT_WIDTH*RECT_HEIGHT):#点阵信息为1,即代表此处要显示头像来组字ifitem[i]!='1':continue#每个点使用放置几个矩阵,比如2*2,3*3forcountinrange(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_CLIPSIZEposy=((i//RECT_HEIGHT)*HEAD_NUM+(count//HEAD_NUM))*HEAD_CLIPSIZEcanvas.paste(headImg,(posx,posy))#调整n以读取后续图片n=(n+4)%imgCount#保存图片quality代表图片质量,1-100canvas.save('result_{0}.jpg'.format(index),quality=100)#将gbk转换为unicode格式deftransGbk2Unicode(str_v):str_s=str_v.replace(r'%',r'\x')res=eval(repr(str_s).replace('\\\\','\\'))returnres.decode('gb2312')if__name__=="__main__":inputStr=u'请输入您想要生成的文字(ENTER结束):'#输入内容,将中文从unicode转换为gbk,防止乱码content=raw_input(inputStr.encode('gbk'))#将gbk转换为unicode,以方便遍历时能够遍历每个文字或字母content=transGbk2Unicode(content)print(u'注意:指定文字每个仅能生成一个')#循环遍历index=0for_strincontent:print(u'生成汉字:'+_str)#将字转化为汉字库的点阵数据outlist=char2bit(_str)#将头像图片按点阵拼接成单字图片head2char(index,outlist)index+=1print(u'生成成功!!!')

执行结果:

python HZK16字库如何使用

python HZK16字库如何使用

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:python HZK16字库如何使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:怎么使用JavaScript快速实现一个颜色选择器下一篇:

10 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18