鱼C论坛

 找回密码
 立即注册
查看: 3718|回复: 4

[技术交流] 五星红旗国庆头像制作教程来了

[复制链接]
发表于 2021-9-30 18:51:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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. 读取图片
  1. from PIL import Image

  2. guoqi = Image.open('五星红旗.png')
  3. touxiang = Image.open('头像.jpg')
复制代码


                               
登录/注册后可看大图


                               
登录/注册后可看大图

2.2. 截取区域

由于这里我的头像是正方形,为了方便在粘贴透明渐变国旗时更方便,需要截取正方形区域。
  1. # 获取国旗的尺寸
  2. x,y = guoqi.size
  3. # 根据需求,设置左上角坐标和右下角坐标(截取的是正方形)
  4. 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。
  1. # 获取头像的尺寸
  2. w,h = touxiang.size
  3. # 将区域尺寸重置为头像的尺寸
  4. quyu = quyu.resize((w,h))
  5. # 透明渐变设置
  6. for i in range(w):
  7.     for j in range(h):
  8.         color = quyu.getpixel((i, j))
  9.         alpha = 255-i//3
  10.         if alpha < 0:
  11.             alpha=0
  12.         color = color[:-1] + (alpha, )
  13.         quyu.putpixel((i, j), color)
复制代码


                               
登录/注册后可看大图

2.4. 粘贴到头像并保存

需要注意粘贴的时候要保留透明背景,否则就不好玩了,等于直接全覆盖
  1. touxiang.paste(quyu,(0,0),quyu)
  2. touxiang.save('五星红旗半透明渐变头像.png')
复制代码


                               
登录/注册后可看大图

当然,我们还可以用别的透明渐变的方式,比如左上角到右下角之类的,具体这里不展开演示了,感兴趣的可以直接负责完整代码自己测试玩玩!
3. 完整代码
  1. from PIL import Image

  2. # 读取图片
  3. guoqi = Image.open('五星红旗.png')
  4. touxiang = Image.open('头像.jpg')

  5. # 获取国旗的尺寸
  6. x,y = guoqi.size
  7. # 根据需求,设置左上角坐标和右下角坐标(截取的是正方形)
  8. quyu = guoqi.crop((262,100, y+62,y-100))

  9. # 获取头像的尺寸
  10. w,h = touxiang.size
  11. # 将区域尺寸重置为头像的尺寸
  12. quyu = quyu.resize((w,h))
  13. # 透明渐变设置
  14. for i in range(w):
  15.     for j in range(h):
  16.         color = quyu.getpixel((i, j))
  17.         alpha = 255-i//3
  18.         if alpha < 0:
  19.             alpha=0
  20.         color = color[:-1] + (alpha, )
  21.         quyu.putpixel((i, j), color)

  22. # 粘贴到头像并保存
  23. touxiang.paste(quyu,(0,0),quyu)
  24. touxiang.save('五星红旗半透明渐变头像.png')
复制代码

|原文链接:https://mp.weixin.qq.com/s/s8HSS99O2zobCijxJhD9NA

                               
登录/注册后可看大图

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 收起 理由
小甲鱼 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-1 03:34:43 | 显示全部楼层
很给力,国庆快乐~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 17:53:58 | 显示全部楼层
python 永远的神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-5 09:39:55 | 显示全部楼层
好帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-14 12:48:43 | 显示全部楼层
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/python啊啊啊/渐变国庆头像.py", line 4, in <module>
    guoqi = Image.open('背景.png')
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\PIL\Image.py", line 3092, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: '背景.png'
这个报错怎么办?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表