为了账号安全,请及时绑定邮箱和手机立即绑定

本文只适合python新人练手,不适合没用过Python的朋友来给自己头像加国旗

标签:
Python

代码:


# -*- coding: utf-8 -*-

# 顾清宇(Ainley)

# python 3.7.4

https://www.edu-parks.com

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

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


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,就可以引用该库来使用了。

在代码全部完成时,前面那个朋友并没有提供国旗图片,所以自己去找了一些,尺寸需要调整,不同的人,他的头像图片尺寸也不一样,也是需要更改

大家可以看到的是,其实我的那个国旗不是微信官方的那种。因为前面那个朋友并没有提供国旗的图片,他放在网盘里面了,而我又不想麻烦去下载,所以就自己去找了一张国旗的图片,那图片尺寸的问题必然是不对的,所以需要更改,改图片尺寸的函数是,thumbnail(),在下面我会介绍一下。

代码中修改图片尺寸的thumbnail()函数的一些问题(缩略图+原比例不变)

在这个函数里面我玩了很久,一开始不知道它的一些特性,只知道它是可以修改图片尺寸,我就各种尝试,然后各种运行程序报错,搞了得有半个小时吧,想要摸清它,后来我去网上搜了一下,发现网上就有介绍它的文章……

所以建议大家哦,以后想搞懂一个函数的具体作用,最方便那就是上网搜,前辈已经为我们总结好了,当然如果想自己摸索加深印象,当然也是OK的啦!

那我就在这里再简单总结一下,thumbnail()函数生成缩略图,注意是缩略图,所以你生成的图像尺寸应该比原图小。它接受一个元组作为参数,分别对应着缩略图的宽高,在缩略时,函数会保持图片的宽高比例。

如果你原图尺寸小于给定参数,那就不是缩略图了,那么这个函数将不起作用;如果你参数宽高和原图像宽高比不同,则会根据j较大对应边进行原比例缩放。举个例子:一张图片为300 X 420大小,当参数为(200,200)时,生成的缩略图大小为142 X 200。(我这里用了大写X,而没有用*,是因为,两个星号之间自动就斜体显示了,没用过csdn写博客的朋友可能看不懂,没关系,略过~)

第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,不过如果你给的足够精确,它还是很听话的,比你女朋友还听话???女朋友一般会听话吗?没女朋友的我不知道诶(手动狗头保命!)。https://www.elktara.com

保存图片时,要保存为png格式

如果保存成jpg格式,它会报错cannot write mode RGBA as JPEG,我们前面有定义im.convert(“RGBA”),所以可能这就是PNG和JPEG的一个区别吧,总之保存成png格式的图片就可以了。




点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消