艾特微信官方生成加国旗头像的python实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/A_Ainley/article/details/101701071

我是参考这个朋友的博客,做了一些修改,适合python新人来练手。原博客:如何给自己的头像添加小国旗
本文只适合python新人练手,不适合没用过Python的朋友来给自己头像加国旗,想加国旗可以去前面链接里面的那篇文章。
效果如下:
国旗原头像新头像

代码:

# -*- coding: utf-8 -*-
# 顾清宇(Ainley)
# python 3.7.4

from __future__ import print_function
from PIL import Image

# 给图片右下角加国旗,欢迎国庆,喜庆70周年

class redFlag:

	def Add(self):
		# 打开国旗图片
		imgRedFlag = Image.open("RedFlag.jpg")
		imgRedFlag = imgRedFlag.convert('RGBA')
		# 打开原来的微信头像
		imgOld = Image.open('old.jpg')
		imgOld = imgOld.convert('RGBA')
		# 判断图片大小,统一改成700*700
		if imgOld.size != (640, 640):
			size = (640,640)
			imgOld.thumbnail(size)
		
		if imgRedFlag.size != (200, 133):
			size = (200, 133)
			imgRedFlag.thumbnail(size)
		
		# 将国旗图片粘贴到原微信头像
		imgOld.paste(imgRedFlag, (440, 507, 640, 640))
		imgOld.show()
		imgOld.save('new.png')

img = redFlag()
img.Add()

其中有一些我在修改代码,玩的过程中发现了几个问题,分别是:

  1. pip install PIL时失败,报错No matching distribution found for PIL
    背景介绍:PIL(Python Imaging Library)是python的一个强大方便的图像处理库,但是它只支持到python2.7,而我使用的是python3.7.4,所以我pip install PIL失败。
    那么,怎么解决呢?我再介绍一个库,Pillow。Pillow是PIL的一个派生分支,但是如今已经发展成为比PIL本身更具有活力的图像处理库了。所以解决方案就是,命令行输入pip install Pillow,就可以了,安装了Pillow之后,代码不需要改变,使用from PIL import Image,就可以引用该库来使用了。
  2. 在代码全部完成时,前面那个朋友并没有提供国旗图片,所以自己去找了一些,尺寸需要调整,不同的人,他的头像图片尺寸也不一样,也是需要更改
    大家可以看到的是,其实我的那个国旗不是微信官方的那种。因为前面那个朋友并没有提供国旗的图片,他放在网盘里面了,而我又不想麻烦去下载,所以就自己去找了一张国旗的图片,那图片尺寸的问题必然是不对的,所以需要更改,改图片尺寸的函数是,thumbnail(),在下面我会介绍一下。
  3. 代码中修改图片尺寸的thumbnail()函数的一些问题(缩略图+原比例不变)
    在这个函数里面我了很久,一开始不知道它的一些特性,只知道它是可以修改图片尺寸,我就各种尝试,然后各种运行程序报错,搞了得有半个小时吧,想要摸清它,后来我去网上搜了一下,发现网上就有介绍它的文章……
    此处微笑
    所以建议大家哦,以后想搞懂一个函数的具体作用,最方便那就是上网搜,前辈已经为我们总结好了,当然如果想自己摸索加深印象,当然也是OK的啦!
    那我就在这里再简单总结一下,thumbnail()函数生成缩略图,注意是缩略图,所以你生成的图像尺寸应该比原图小。它接受一个元组作为参数,分别对应着缩略图的宽高,在缩略时,函数会保持图片的宽高比例。
    如果你原图尺寸小于给定参数,那就不是缩略图了,那么这个函数将不起作用;如果你参数宽高和原图像宽高比不同,则会根据j较大对应边进行原比例缩放。举个例子:一张图片为300 X 420大小,当参数为(200,200)时,生成的缩略图大小为142 X 200。(我这里用了大写X,而没有用*,是因为,两个星号之间自动就斜体显示了,没用过csdn写博客的朋友可能看不懂,没关系,略过~)
  4. 第3条的原因导致下面的im.paste()函数报错images do not match
    我发现im.paste()这个函数极其傲娇,这个网上有很多文章讲它,具体的我就不说了,它有好几种重载方式:
    im.paste( image, box ); im.paste( colour, box ); im.paste( image, box, mask ); im.paste( colour, box, mask );其中那个第二个参数box是存放一个元组,用来表示第二张图片在第一张图片上的位置,它不能有一点差错,必须很精确它才可以,否则它就罢工,它就报错images do not match,不过如果你给的足够精确,它还是很听话的,比你女朋友还听话???女朋友一般会听话吗?没女朋友的我不知道诶(手动狗头保命!)。
  5. 保存图片时,要保存为png格式
    如果保存成jpg格式,它会报错cannot write mode RGBA as JPEG,我们前面有定义im.convert(“RGBA”),所以可能这就是PNG和JPEG的一个区别吧,总之保存成png格式的图片就可以了。

写完啦!如果有朋友尝试这个例子的时候还有遇到问题的话,来评论咱们一起解决呀!
今天是2019.09.30,明天就是祖国70周年,也是我们的国庆节。
假期愉快呀!
我和我亲爱滴祖国,一刻也不能分隔~~

猜你喜欢

转载自blog.csdn.net/A_Ainley/article/details/101701071