| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
国庆节终于来了,最近有个五星红旗半透明渐变头像很火,在抖音里、微信群里都流行起来了。 
 
那么,作为 python 玩家,是不是也要共享一下自己的力量,用 python 快速制作这样的头像呢!? 
 
来吧,展示! 
 
目录: 
 
1. 原理简介 
 
2. 实现步骤 
 
2.1. 读取图片 
 
2.2. 截取区域 
 
2.3. 设置透明渐变 
 
2.4. 粘贴到头像并保存 
 
3. 完整代码 
 
 
1. 原理简介 
 
我们看到这样的头像,大致是红旗透明度渐变然后覆盖在自己头像上即可。 
 
那么,我的思路大致是先通过红旗图片获取和自己头像尺寸一样的区域,然后将这部分区域从左到右进行透明度渐变增长,然后将这张图片和头像进行融合,最终保存即可。 
 
基于这个思路,结合之前《Python 基础模块:图像处理模块 @PIL (批量分类处理图片及添加水印)》里介绍的 PIL 库,我们大致可以将实现步骤拆分为如下几步: 
 
读取国旗和头像照片 open 
截取国旗部分区域 crop 
从左到右透明度渐变 putpixel 
将区域粘贴到头像 paste+resize 
保存新头像 save 
既然明确了实现步骤,我们就开搞吧! 
 
2. 实现步骤 
 
大家记得实现准备国旗和自己头像照片到本地哦 
 
后台 回复 955,在国庆文件夹领取 国旗文件,或者文末添加作者微信 回复 国庆 领取。 
 
2.1. 读取图片 
- from PIL import Image
 
  
- guoqi = Image.open('五星红旗.png')
 
 - touxiang = Image.open('头像.jpg')
 
  复制代码 
 
 
2.2. 截取区域 
  
由于这里我的头像是正方形,为了方便在粘贴透明渐变国旗时更方便,需要截取正方形区域。 
- # 获取国旗的尺寸
 
 - x,y = guoqi.size
 
 - # 根据需求,设置左上角坐标和右下角坐标(截取的是正方形)
 
 - quyu = guoqi.crop((262,100, y+62,y-100))
 
  复制代码 
 
2.3. 设置透明渐变 
  
在 PIL 库中,getpixel((i, j)) 表示获取 (i,j) 像素点的颜色值 color,同样我们可以通过 putpixel((i, j), color) 来对 (i,j) 像素点设置颜色。 
 
而对应 color 来说,是包含四个参数的元组 (R,G,B,alpha),分别是 RGB 值和透明度,其中透明度 255 表示不透明,0 表示 100% 透明。 
 
了解以上这些知识,我们就可以开始进行透明度渐变的操作了。 
 
本例最简单满足需求的就是透明渐变从左到右透明度依次变高(参数值变小),考虑到从 255 变为 0 且只能是整数,这里由于微信头像是 900*900,所以我考虑的是每 3 个像素进行一次透明度渐变,当超过 255 之后则透明度为 100% 也就是对应参数为 0。 
- # 获取头像的尺寸
 
 - w,h = touxiang.size
 
 - # 将区域尺寸重置为头像的尺寸
 
 - quyu = quyu.resize((w,h))
 
 - # 透明渐变设置
 
 - for i in range(w):
 
 -     for j in range(h):
 
 -         color = quyu.getpixel((i, j))
 
 -         alpha = 255-i//3
 
 -         if alpha < 0:
 
 -             alpha=0
 
 -         color = color[:-1] + (alpha, )
 
 -         quyu.putpixel((i, j), color)
 
  复制代码 
 
2.4. 粘贴到头像并保存 
  
需要注意粘贴的时候要保留透明背景,否则就不好玩了,等于直接全覆盖 
- touxiang.paste(quyu,(0,0),quyu)
 
 - touxiang.save('五星红旗半透明渐变头像.png')
 
  复制代码 
 
当然,我们还可以用别的透明渐变的方式,比如左上角到右下角之类的,具体这里不展开演示了,感兴趣的可以直接负责完整代码自己测试玩玩! 
3. 完整代码 
- from PIL import Image
 
  
- # 读取图片
 
 - guoqi = Image.open('五星红旗.png')
 
 - touxiang = Image.open('头像.jpg')
 
  
- # 获取国旗的尺寸
 
 - x,y = guoqi.size
 
 - # 根据需求,设置左上角坐标和右下角坐标(截取的是正方形)
 
 - quyu = guoqi.crop((262,100, y+62,y-100))
 
  
- # 获取头像的尺寸
 
 - w,h = touxiang.size
 
 - # 将区域尺寸重置为头像的尺寸
 
 - quyu = quyu.resize((w,h))
 
 - # 透明渐变设置
 
 - for i in range(w):
 
 -     for j in range(h):
 
 -         color = quyu.getpixel((i, j))
 
 -         alpha = 255-i//3
 
 -         if alpha < 0:
 
 -             alpha=0
 
 -         color = color[:-1] + (alpha, )
 
 -         quyu.putpixel((i, j), color)
 
  
- # 粘贴到头像并保存 
 
 - touxiang.paste(quyu,(0,0),quyu)
 
 - touxiang.save('五星红旗半透明渐变头像.png')
 
  复制代码 
|原文链接:https://mp.weixin.qq.com/s/s8HSS99O2zobCijxJhD9NA |   
 
评分
- 
|  参与人数 1 | 荣誉 +2 | 
鱼币 +3 | 
贡献 +3 | 
收起
理由
 | 
 
  小甲鱼
 |  + 2 | 
 + 3 | 
 + 3 | 
鱼C有你更精彩^_^ | 
 
 
查看全部评分
 
 
 
 
 
 |