将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果

时间:2023-01-04 14:16:32

第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果
将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果

这个问题需要用到PIL库,涉及到一些非常基本的用法。代码如下:

    from PIL import Image,ImageFont,ImageDraw#从PIL库导入所需模块
    import sys
    reload(sys)   #必须要reload
    sys.setdefaultencoding('utf-8')#字符编码改为utf8


    headPath=r"C:\\github\\PythonExercise\\pictures\\"         
    #头像图片路径
    outputPath=r"C:\\github\\PythonExercise\\pictures\\"       
    #处理后输出路径
    fontPath=r"C:\\Windows\\Fonts\\"  
    #字体路径
    headFile="head.jpg"           #头像文件
    outFile="output.jpg"          #输出文件
    #打开图片,建立画布
    image=Image.open(headPath+headFile,'r')
    draw=ImageDraw.Draw(image)

    #由图片大小确定字体大小
    fontsize=min(image.size)/4

    #增加文字
    fontobj=ImageFont.truetype(font=fontPath+"AdobeHeitiStd-Regular.otf",size=fontsize,index=0,encoding='',filename=None)#实例字体对象
    draw.text((image.size[0]-fontsize,0),text="5",fill=(255,0,0),font=fontobj,anchor=None)#用draw对象的text()方法添加文字 
    image.save(outputPath+outFile)#保存图片

作为一个Python初学者,写这段程序的时候遇到了很多错误,首先是路径,“\”需要用转义字符来转义一下。
在实例字体对象的时候,需要加载系统中的字体,windows系统的字体文件在C:\windows\fonts目录下面,一开始加载的时候直接用了资源管理器中显示的名称,并且理所当然的认为文件应该是ttf文件。结果报错

IOError: cannot open resource

肯定是找不到文件了,于是从fonts目录拷贝了一种字体到其它文件夹,发现文件名称弄错了,而且有些字体看起来是一个文件,拷贝到其它文件会变成好几个文件,而且文件名也跟看起来不太一样。
为了图省事,直接把字体文件拷贝到了工作目录下的pictures文件夹了。

最后调用text()方法给图片添加文字时,出现了喜闻乐见的编码错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 37: ordinal not in range(128)

利用万能的Google,解决方法如下:

    import sys
    reload(sys)   #必须要reload
    sys.setdefaultencoding('utf-8')#字符编码改为utf8