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

简介: 用Python做个音乐海报

前言

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

在这里插入图片描述

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

用Pillow创建圆形图

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

pip install pillow

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

# 该方法传入三个参数,第一个为模式,第二个为大小的元组,第三个为颜色
im = Image.new('RGBA', (300, 300), (255, 255, 255, 0))

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

# 获取绘制者
drawer = ImageDraw.Draw(im)
# 绘制一个黄色的圆,ellipse方法传入三个参数,第一个为包含该圆的最小正方形的区域,第二个为颜色,第三个为边宽
drawer.ellipse((0, 0, 300, 300), fill=(255, 255, 0), width=0)

生成图片如下:

在这里插入图片描述

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

在这里插入图片描述

代码如下:

# 打开要转换成圆形的图片,我们事先把图片裁剪好
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就是圆形图片了,完整代码如下:

# 背景图中圆的直径
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获取的)。

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

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

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

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

素材图片也在里面。

目录
相关文章
|
5月前
|
数据可视化 安全 数据安全/隐私保护
使用Python做个可视化的“剪刀石头布”小游戏
使用Python做个可视化的“剪刀石头布”小游戏
92 0
|
5月前
|
Python
Python 采集某网站音乐
Python 采集某网站音乐
33 0
|
11月前
|
搜索推荐 算法 前端开发
音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
104 1
音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
|
11天前
|
机器学习/深度学习 数据采集 人工智能
使用Python实现深度学习模型:智能音乐创作与生成
使用Python实现深度学习模型:智能音乐创作与生成
29 3
|
2月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的音乐推荐管理系统
该项目是基于Python+Vue开发的音乐推荐管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的音乐推荐管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 1
|
3月前
|
数据采集 机器学习/深度学习 数据挖掘
数据也需SPA?Python转换大法,给你的数据做个全身放松SPA!
【7月更文挑战第20天】在Python中,数据SPA涉及理解需求、清洗(如用Pandas去除重复值、填充缺失值)、格式转换(如日期字符串转datetime)及聚合分析(如按年份分组求和)。Pandas库是数据清洗的强大工具,能有效提升数据质量,便于决策和机器学习。通过这些步骤,数据得以优化,准备就绪以应对各种分析挑战。
32 1
|
3月前
|
数据采集 数据可视化 数据挖掘
数据分析入门:用Python和Numpy探索音乐流行趋势
数据分析入门:用Python和Numpy探索音乐流行趋势
|
5月前
|
前端开发 Python
python制作七夕音乐贺卡
本篇博文是一个关于制作音乐贺卡的教程。自己在去年的在七夕节期间创作了一个代码项目,允许用户自定义背景、音乐和祝福语,生成一个包含音乐的HTML贺卡。教程分为三个部分:前言、制作流程和具体代码。前言提到,由于找不到现成的音乐贺卡模板,我决定自己动手,制作的贺卡适用于各种节日。制作流程包括两个步骤,一是通过提供的Python代码工具选择背景图片、音乐文件和输入祝福语,生成HTML贺卡;二是提供了一个预打包的exe文件,用户可以直接运行并按照提示操作。最后,文章分享了生成贺卡的具体Python代码,并以一句鼓励的话语结尾,强调了努力和选择的重要性。
|
5月前
|
人工智能 Python
beets,一个有趣的 Python 音乐信息管理工具!
beets,一个有趣的 Python 音乐信息管理工具!
100 4
|
5月前
|
算法 数据可视化 搜索推荐
Python使用矩阵分解法找到类似的音乐
Python使用矩阵分解法找到类似的音乐
下一篇
无影云桌面