Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >来,我教你用Python做个音乐海报

来,我教你用Python做个音乐海报

作者头像
ZackSock
发布于 2020-03-04 08:02:19
发布于 2020-03-04 08:02:19
96700
代码可运行
举报
文章被收录于专栏:ZackSockZackSock
运行总次数:0
代码可运行

前言

前段时间在一个朋友那么得到的灵感,想到可以用音乐播放页面作为一张海报图片。其实接下来要讲的和海报还是有差距的,而具体实现也只是简单的图片粘贴,但是在效果上还是不错的。效果图如下,希望大家喜欢:

左边是原图,右边是需要添加到中间的图,也是图的主角。其实如果直接用ps实现上面的图是非常简单的,反倒是用代码实现有点曲折,不过实现过程还是非常有趣的,希望这篇博客可以可以让你学到知识。

用Pillow创建圆形图

在上面的图片中,中间是一个圆形图片,而Pillow本身是没有提供生成圆形图片的方法(也可能是我没找到),所以就需要自己实现。在实现之前,我们先安装Pillow模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install pillow

要创建圆形图,我们先根据原图的大小,创建一个RGBA模式的透明图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 该方法传入三个参数,第一个为模式,第二个为大小的元组,第三个为颜色
im = Image.new('RGBA', (300, 300), (255, 255, 255, 0))

上述代码是创建了一个完全透明的300*300的图片,我们在该图片上绘制一个最大的圆:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取绘制者
drawer = ImageDraw.Draw(im)
# 绘制一个黄色的圆,ellipse方法传入三个参数,第一个为包含该圆的最小正方形的区域,第二个为颜色,第三个为边宽
drawer.ellipse((0, 0, 300, 300), fill=(255, 255, 0), width=0)

生成图片如下:

我们准备一张300*300的正方形图片,然后遍历图片的每个像素,如果像素值的A==0(即像素不透明)那我们就将图片该区域的像素值设置为透明。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 打开要转换成圆形的图片,我们事先把图片裁剪好
pic = Image.open(img_path).convert('RGBA')
# 遍历图片的每个像素
for i in range(300):
    for j in range(300):
        # 获取该像素点的像素
         r, g, b, a = im.getpixel((i, j))
        # 当rgb值不是黄色时,即像素值为透明时
        if (r, g, b) != (255, 255, 0):
            # 将原图的像素值设置为透明
            pic.putpixel((i, j), (255, 255, 255, 0))

我们的pic就是圆形图片了,完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 背景图中圆的直径
radius = 533
# 图片的大小
circle_size = (radius, radius)
def generate_circle_image(img_path):
    # 创建一个透明的正方形
    im = Image.new('RGBA', circle_size, (255, 255, 255, 0))
    # 获取绘画者
    drawer = ImageDraw.Draw(im)
    # 在透明的正方形上画一个黄色的圆
    drawer.ellipse((0, 0, circle_size[0], circle_size[1]), fill=(255, 255, 0), width=0)
    # 打开要转换成圆形的图片,我们事先把图片裁剪好
    pic = Image.open(img_path).convert('RGBA')
    # 修改图片大小,让图片和圆大小一样
    re_pic = pic.resize(circle_size, Image.ANTIALIAS)
    # 遍历图片的每个像素
    for i in range(circle_size[0]):
        for j in range(circle_size[1]):
            r, g, b, a = im.getpixel((i, j))
            if (r, g, b) != (255, 255, 0):
                re_pic.putpixel((i, j), (255, 255, 255, 0))
    return re_pic

在上面的方法中,我们改进了一些代码,之前我们需要使用指定大小的图片作为素材,现在只需要是正方形图片就可以了。

生成海报

原本我以为直接将圆形图片粘贴到背景图片上就可以了,但是试过之后发现效果和我想的不太一样,反正就是没成功,效果如下:

是粘贴上去了没错,而且图片也是透明效果,但是从这个效果来看粘贴只是像素替换,而不是图片叠加。于是我又想到了遍历像素的办法。

我通过特殊手段获取了上面正方形离左边的像素,和离上边的像素(其实就是用ps看了一下)。我尝试过图形检测和像素判断的办法,想自动识别中间圆的位置,但是效果不佳(反正就是失败了),所以只能无耻的用ps查看像素。

回到正题,我们用遍历像素的办法不需要遍历整个图片,只需要从(left, top)像素开始,遍历到(left+radius, top+radius)区域即可,也就是遍历正方形区域(left、top和radius都是我通过ps获取的)。

我们先将背景图片拷贝一份,然后在副本上进行粘贴。然后遍历粘贴后的图片,如果像素值为透明,我们就将原图该位置的像素替换至副本处,实现原理和上面一样,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def generate_music_post(circle_im, bg_im):
     """
         传入圆形图片和背景图片生成音乐海报
         circle_im:圆形图片
         bg_im:背景图片
         return:生成的图片
     """
    # 拷贝副本
    bg_copy = bg_im.copy()
    # 将圆形图片粘贴到副本上
    bg_copy.paste(circle_im, (left, top))
    # 遍历像素正方形区域
    for i in range(left, left+radius):
        for j in range(top, top+radius):
            # 获取像素值
            color = bg_copy.getpixel((i, j))
            # 如果像素透明。color的值为(r,g,b,a),color[3]为a的值,即透明值
            if color[3] == 0:
                # 将原图像素替换至副本透明处
                bg_copy.putpixel((i, j), bg_im.getpixel((i, j)))
    # 返回合成后的图片
    return bg_copy

这样就完成了。完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PIL import Image, ImageDraw

left = 273            # 圆离左边的距离
top = 573            # 圆离上边的距离
radius = 533        # 圆的直径
circle_size = (radius, radius)        # 圆的外接正方形的大小

def generate_circle_image(img_path):
    # 创建一个透明的正方形
    im = Image.new('RGBA', circle_size, (255, 255, 255, 0))
    # 获取绘画者
    drawer = ImageDraw.Draw(im)
    # 在透明的正方形上画一个黄色的圆
    drawer.ellipse((0, 0, circle_size[0], circle_size[1]), fill=(255, 255, 0), width=0)
    # 打开要转换成圆形的图片,我们事先把图片裁剪好
    pic = Image.open(img_path).convert('RGBA')
    re_pic = pic.resize(circle_size, Image.ANTIALIAS)

    # 遍历图片的每个像素
    for i in range(circle_size[0]):
        for j in range(circle_size[1]):
            r, g, b, a = im.getpixel((i, j))
            if (r, g, b) != (255, 255, 0):
                re_pic.putpixel((i, j), (255, 255, 255, 0))

    return re_pic

def generate_music_post(circle_im, bg_im):
     """
         传入圆形图片和背景图片生成音乐海报
         circle_im:圆形图片
         bg_im:背景图片
         return:生成的图片
     """
    # 拷贝副本
    bg_copy = bg_im.copy()
    # 将圆形图片粘贴到副本上
    bg_copy.paste(circle_im, (left, top))
    # 遍历像素正方形区域
    for i in range(left, left+radius):
        for j in range(top, top+radius):
            # 获取像素值
            color = bg_copy.getpixel((i, j))
            # 如果像素透明。color的值为(r,g,b,a),color[3]为a的值,即透明值
            if color[3] == 0:
                # 将原图像素替换至副本透明处
                bg_copy.putpixel((i, j), bg_im.getpixel((i, j)))
    # 返回合成后的图片
    return bg_copy

# 生成圆形图片
pic = generate_circle_image('girl.jpeg')
# 以RGBA模式读取背景图片
bg_im = Image.open('music.jpg').convert('RGBA')
# 生成音乐海报
music_post = generate_music_post(pic, bg_im)
music_post.show()

另外,这个例子还可以更加智能。我们可以使用OpenCV识别主体图片的人脸,然后根据人脸区域计算一个比较适合的正方形区域,这样我们就不必传入正方形(不过还要考虑人脸识别的精确度等问题)。

代码已上传GitHub地址如下: https://github.com/IronSpiderMan/MusicPost [1]

素材图片也在里面。

References

[1] https://github.com/IronSpiderMan/MusicPost : https://github.com/IronSpiderMan/MusicPost

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新建文件夹X 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入剖析Python最强大图片处理模块---Pillow
Pillow作为一个图片模块。可谓是真的简便强大,它的前身是PIL,后来将他取代,现在的pillow 可谓是一家独大,好了,让我们来看看他的具体用法。
Python进阶者
2021/04/19
1.1K0
深入剖析Python最强大图片处理模块---Pillow
Python生成CSDN博客分享图
我们分享博客的方式有很多种,最常见的无非就是分享链接。或者是编辑一条消息,写上标题链接等东西。但是这种方式都不够直观,相比之下图片的方式要更引人注目。CSDN移动端提供了分享图的功能,但是展示的内容是固定的,所以我就想到用Python自己生成分享图。本文只是技术分享,所以在效果上没有下太多功夫,生成的图片比官方是要丑得多,还需包含。
ZackSock
2020/06/04
5890
国庆节换头像热潮:国旗渐变微信头像和微信头像加上国旗!制作教程来了,你会了吗???
明天就是国庆节,再也不用@官方了,自己制作头像更换就可以了。,最近有个五星红旗半透明渐变头像很火,在抖音里、微信群里都流行起来了。
北京-宏哥
2021/10/11
2.6K0
Python 让我舅舅的书法作品和 PIL 库发生点美的误会
不久之前写过一篇文章,详细介绍了 PIL 库中的 Image 模块的使用。曾经学习过、使用过一段时间的 PS,认识 PIL 后,觉得这这玩意太好玩了,有了想使用 PIL 库实现 PS 中的图片特效的想法。
一枚大果壳
2022/08/23
5710
Python  让我舅舅的书法作品和 PIL 库发生点美的误会
解决PIL切圆形图片存在锯齿
发现怎么处理还是会有锯齿 一.一开始我的代码 def convert_image_to_circle(pic_path, outdir): ima = Image.open(pic_path).convert("RGBA") size = ima.size # 因为是要圆形,所以需要正方形的图片 r2 = min(size[0], size[1]) if size[0] != size[1]: imb = Image.new('RGBA', (r2,
小小咸鱼YwY
2020/08/14
1.2K0
#Python小技巧#教你用Python在Excel里画画
实现这个需求的基本思路是读取这张图片每一个像素的色彩值,然后给 excel 里的每一个单元格填充上颜色。所以主要用到的是PIL、openpyxl这两个库。
程序员迪迪
2021/12/20
6700
教你如何用Python处理图片九宫格,炫酷朋友圈
在日常的生活中,大家偶尔会看到朋友圈发的照片由一张被切成九张的效果,有时由一张照片被切成九张照片所带来的视觉盛宴是不一样的!
CDA数据分析师
2019/07/02
1K0
教你如何用Python处理图片九宫格,炫酷朋友圈
python功能笔记——杂七杂八
×××复习阶段,无聊弄点东西玩一下,实现功能有(控制浏览器访问学校校历,截图保存下来,通过图片处理,最终将其设置为桌面):
py3study
2020/01/15
3820
五星红旗国庆头像制作教程来了
国庆节终于来了,最近有个五星红旗半透明渐变头像很火,在抖音里、微信群里都流行起来了。
可以叫我才哥
2022/11/11
1.8K0
五星红旗国庆头像制作教程来了
Python-批量修改图片全部颜色,批量修改图片的指定颜色,马甲包一键换主题UI
开发本软件的主要是为了解决部分程序员在没有UI设计小姐姐的情况下,想批量修改APP的图标和UI的!
用户6004386
2020/09/15
2.3K0
小猪佩奇的4种python玩法
为什么要学习python?是因为不仅社会上很多工作需要用到python,同时我们可以利用python做很多好玩儿的事儿,
Python进阶者
2020/07/15
1.2K0
小猪佩奇的4种python玩法
前端基础-CSS背景属性
取值:no-repeat不平铺,repeat-x横向平铺,repeat-y纵向平铺,repeat横向纵向都平铺------默认
cwl_java
2020/04/07
1.2K0
前端基础-CSS背景属性
Python 技术篇-用PIL库修改图片透明度,改变png图片色道为RGBA、RGB。
PIL库可以设置图片透明度。 pip install pillow安装了pillow库后就可以使用PIL库了。
小蓝枣
2020/09/23
4K0
【海贼王航海日志:前端技术探索】CSS你了解多少?(二)
我们的显示器是由很多很多的“像素”构成的。每个像素视为一个点,这个点就能反映出一个具体的颜色。我们使用R(red)、G(green)、B(blue)的方式表示颜色(色光三原色)。三种颜色按照不同的比例搭配,就能混合出各种效果。
枫叶丹
2024/08/09
1400
【海贼王航海日志:前端技术探索】CSS你了解多少?(二)
【编程课堂】海龟作图
0、前言 turtle 是 python 内置的一个比较有趣味的模块,俗称 海龟作图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言,之后一些很酷的 Python 程序员构建了 turtle 库,让其他程序员只需要 import turtle,就可以在 Python 中使用海龟作图。 1、基本功能介绍 在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用
Crossin先生
2018/04/17
3.1K0
【编程课堂】海龟作图
Python绘制漫天的雪花,漫步天涯
雪意寒凉,冰冷了几世千年的轮回。繁华消落成颗颗泛黄泪珠,是凋零,还是化腐朽为神奇?
阿黎逸阳
2020/09/08
1.7K0
Android粒子篇之Bitmap像素级操作
零、前言 1.粒子效果的核心有三个点:收集粒子、更改粒子、显示粒子 2.Bitmap的可以获取像素,从而得到每个像素的颜色值 3.可以通过粒子拼合一张图片,并对粒子操作完成很多意想不到的效果 4.本项目源码见文尾捷文规范第一条,文件为BitmapSplitView.java ---- 一、初识 1.什么是Bitmap像素级的操作: 相信大家都知道一张jpg或png放大后会是一个个小格子,称为一个像素(px),而且一个小格子是一种颜色 也就是一张jpg或png图片就是很多颜色的合集,而这些合集
张风捷特烈
2018/12/14
1.8K0
Python 细聊!可以媲美 PS 的 PIL 图片处理库
PIL 库中提供了诸多用来处理图片的模块,可以对图片做类似于 PS(Photoshop) 的编辑。
一枚大果壳
2022/08/23
1.2K0
Python 细聊!可以媲美  PS  的 PIL 图片处理库
【JavaEE初阶】CSS
层叠样式表。(Cascading Style Sheets) CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离。
xxxflower
2023/10/16
3410
【JavaEE初阶】CSS
Python人脸识别—我的眼里只有你
人脸识别总感觉特别高深,但是因为Python中已经有很多前辈写好了一些库,可以直接调用,大大降低了人脸识别的难度。
阿黎逸阳
2020/09/08
5810
推荐阅读
相关推荐
深入剖析Python最强大图片处理模块---Pillow
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验