前言

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

左边是原图,右边是需要添加到中间的图,也是图的主角。其实如果直接用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

素材图片也在里面。

以上就是用Python制作音乐海报的详细内容,更多关于python 制作音乐海报的资料请关注云海天教程其它相关文章!

python制作音乐相册_用Python制作音乐海报相关推荐

  1. python音乐相册_用 Python 绘制音乐图谱

    在本文中,我们将探讨一种简洁的方式,以此来可视化你的MP3音乐收藏.此方法最终的结果将是一个映射你所有歌曲的正六边形网格地图,其中相似的音轨将处于相邻的位置.不同区域的颜色对应不同的音乐流派(例如:古 ...

  2. python音乐相册_学Python爬虫,就得从爬高清美图开始!

    写在前面 前几天玩游戏时,lol盒子右下角有条广告,广告大概这个样子 咦,小姐姐,还有cosplay,点进去看看. 哇,发现一个好玩的网站,好多漂亮的妹子,页面打开很流畅,点开后有的浏览页面还有好听的 ...

  3. js拆字_分图程序 _制作个人字体_手写字制作ttf字体方法

    js拆字_分图程序 _制作个人字体_手写字制作ttf字体方法 前言 FontForgeBuilds制作ttf FontForgeBuilds制作个人字体 Adobe_Fireworks_CS5批量转换 ...

  4. python 音乐相册_‎App Store 上的“魔力相册-音乐相册、视频电子相册制作工具”...

    [产品特点] * 没学过P图设计,后期剪辑也能制作出好看又精美的音乐视频相册,H5微场景相册: * 多种比例模板,横屏竖屏任意切换,抖音.快手等短视频制作神器: * 海量音乐库资源,支持手机本地和PC ...

  5. python制作音乐模块_用Python打造一个只属于你的专属音乐播放器,享受动手的快乐!...

    平常我们总是用爬虫爬取网页上的音乐,今天我们换个玩法,用Python制作一个独一无二只属于你的音乐播放器,小伙伴们觉得如何?如果觉得提议还不错,那就立即动手吧! 一.需要的库 pygame tkint ...

  6. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)

    抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...

  7. 如何用python编程制作出表格_使用Python轻松制作漂亮的表格

    原标题:使用Python轻松制作漂亮的表格 转自:https://www.linuxmi.com Python太有用而且很方便 图表可以用matplotlib轻松制作,数值计算只要有numpy就行. ...

  8. 如何用python制作三维动画_用Python制作3D动画

    很多小伙伴可能不知道,在3D动画甚至电影制作的过程中,Python也在其中扮演了很重要的角色呢! 比如皮克斯的动画片一般使用Maya软件制作,并且流程中使用到了大量的Maya Python插件. 另外 ...

  9. python身份证验证系统_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...

    大家好哇,又是一个愉快的周末,今天本鸟给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性别及 ...

  10. 用python能制作毕业相册吗_毕业相册如何制作?

    展开全部 毕业,是一个沉重的动词: 毕业,是一个让人一生难忘的名词: 毕业,是感32313133353236313431303231363533e78988e69d8331333337383334动时 ...

最新文章

  1. eclipese web前端开发教学_Web前端零基础好学吗?新手该怎么学?
  2. 百度地图 app 点击事件无效、不触发 解决方案
  3. MySQL中文参考手册-- 常用查询的例子
  4. tp框架 db::name_玩! 框架:为什么我会爱上它
  5. php 网站上传大小限制吗,配置PHP程序网站上传文件大小的限制!
  6. 详解数据可视化的4种类型:手把手教你正确选择图表
  7. C#3.0中的新特性
  8. 创建一个urdf机器人_Matlab官方机器人工具箱Robotics System Toolbox官网翻译教程2
  9. 局域网管理工具_个人(wiki)知识管理工具-一代神器之mybase
  10. 计算机视觉的测试数据集,自动驾驶数据集整理
  11. java ognl表达式_OGNL表达式
  12. php智能合约语言,智能合约语言 Solidity 教程系列9 - 错误处理
  13. Activiti学习之根据条件判断流程走向
  14. DMZ区的介绍及连接图
  15. linux c 获取进程p id,详解Linux获取线程的PID(TID、LWP)的几种方式
  16. java word文本框_Java 读取Word文本框中的文本、图片、表格
  17. 算法分析与设计实验报告 ——二分搜索程序算法的实现
  18. 人体感应模块stm32驱动
  19. Rust 社区 RFC 导读 | 构建安全的 I/O
  20. GMT时间与北京时间的转换

热门文章

  1. tomcat是干什么的? 什么叫web容器以及作用?
  2. 详解黑客的攻击方式1---网络欺骗攻击
  3. centos系统安装杀毒软件clamav
  4. 图片免费压缩——在线压缩JPG方法分享
  5. LCR电桥测试仪测量原理 | LCR测试仪使用概要
  6. PT1000 电桥测温
  7. CPU与GPU协同工作
  8. 【Chrome】浏览器控制台设置成中文
  9. 阿里云服务器安装Nginx
  10. 2339: [HNOI2011]卡农