用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

素材图片也在里面。

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

(0)

相关推荐

  • python制作微博图片爬取工具

    有小半个月没有发博客了,因为一直在研究python的GUI,买了一本书学习了一些基础,用我所学做了我的第一款GUI--微博图片爬取工具.本软件源代码已经放在了博客中,另外软件已经打包好上传到网盘中以供下载学习. 一.准备工作 本次要用到以下依赖库:re json os random tkinter threading requests PIL 其中后两个需要安装后使用 二.预览 1.启动 2.运行中 3.结果 这里只将拿一张图片作为展示. 三.设计流程 设计流程分为总体设计和详细设计,这里我会使

  • python实现图片,视频人脸识别(dlib版)

    图片人脸检测 #coding=utf-8 import cv2 import dlib path = "img/meinv.png" img = cv2.imread(path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #人脸分类器 detector = dlib.get_frontal_face_detector() # 获取人脸检测器 predictor = dlib.shape_predictor( "C:\\Pytho

  • python邮件中附加文字、html、图片、附件实现方法

    关于python写邮件各种功能我们已经介绍过很多,大家有兴趣可以参考: python自动化发送邮件实例讲解 python实现发送QQ邮件(可加附件) 下面我们看下本次介绍的全部代码实例 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.header i

  • python使用PIL给图片添加文字生成海报示例

    前言 曾经,我也算半个所谓的文学青年.大学前两年大部分时间泡在图书馆看各种文学类的书. 那时的我,对于未来有很多遐想:写小说.写时评.写诗歌... 总而言之,就是成为一个文字工作者 现在我确实成为了一个文字工作者,只不过写的是代码... 在某个月黑风高的晚上,看着满屏花花绿绿的代码,揉着酸涩的眼睛,打了一个长长的哈欠.突然进入了禅定时刻: "还记得年少时的梦吗?" 我又开始想写作了,一个写了几年代码的老男人,在被生活粗暴地摁在地上摩擦几回后,突然触发了内心的柔软,想写些东西. 要写些什

  • python 实现图片修复(可用于去水印)

    在现实的生活中,我们可能会遇到一些美好的或是珍贵的图片被噪声干扰,比如旧照片的折痕,比如镜头上的灰尘或污渍,更或者是某些我们想为我所用但有讨厌水印,那么有没有一种办法可以消除这些噪声呢? 答案是肯定的,依然是被我们用了无数次的OpenCV这款优秀的框架. 效果预览 图片修复原理 那OpenCV究竟是怎么实现的,简单的来说就是开发者标定噪声的特征,在使用噪声周围的颜色特征推理出应该修复的图片的颜色,从而实现图片修复的. 程序实现解析 标定噪声的特征,使用cv2.inRange二值化标识噪声对图片进

  • python实现图像,视频人脸识别(opencv版)

    图片人脸识别 import cv2 filepath = "img/xingye-1.png" img = cv2.imread(filepath) # 读取图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色 # OpenCV人脸识别分类器 classifier = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haar

  • python爬虫爬取图片的简单代码

    Python是很好的爬虫工具不用再说了,它可以满足我们爬取网络内容的需求,那最简单的爬取网络上的图片,可以通过很简单的方法实现.只需导入正则表达式模块,并利用spider原理通过使用定义函数的方法可以轻松的实现爬取图片的需求. 1.spider原理 spider就是定义爬取的动作及分析网站的地方. 以初始的URL**初始化Request**,并设置回调函数. 当该request**下载完毕并返回时,将生成**response ,并作为参数传给该回调函数. 2.实现python爬虫爬取图片 第一步

  • python 使用xlsxwriter循环向excel中插入数据和图片的操作

    写入Excel中后有显示第一列客户款号总库存这些,开始写在第12行第一列开始写入,一行写入5个,然后再隔12行,再写入下边的数据,图片需要对应客户款号在Excel写入图片,类似下面的格式 import xlsxwriter import os #以空字符填充缺失值,不然写入数据会报错 data.fillna('',inplace=True) #创建一个新Excel文件并添加一个工作表. workbook = xlsxwriter.Workbook('images.xlsx') worksheet

  • Python基于mediainfo批量重命名图片文件

    案例故事: 大部分带彩色屏幕的终端设备,不管是手机,车机,电视等等,都需要涉及图片的显示, 作为一名专业的多媒体测试人员,我们需要一堆的规范化标准的图片测试文件, 但是现有的图片资源名字命名的很随意比如:IMG_20200325_161111.jpg, 以上命名不能看出图片文件的具体图片编码格式,分辨率等信息, 测试经理要求我进行批量重命名工作,模板如下, 图片编码格式_分辨率_位深度_容器.容器, 例如: JPEG_1920x1080_32bit_jpg.jpg 图片编解码基本知识 图片编码:

  • 如何使用Python进行PDF图片识别OCR

    使用场景 使用图片识别可以快速提取图片中的信息,方便高效. Python并不能直接对PDF进行识别,所以如果是识别PDF的话,需要先将PDF转化为图片,然后再进行识别. 必备工具 Python 可以安装3.7及以上版本 tesseract-ocr 下载地址: https://github.com/UB-Mannheim/tesseract/wiki 使用最新版本即可 需要用到的库 pip install pillow pip install opencv-python pip install f

  • python 调整图片亮度的示例

    实现效果 实现代码 import matplotlib.pyplot as plt from skimage import io file_name='D:/2020121173119242.png' img=io.imread(file_name) Increment = -10.0 img = img * 1.0 I = (img[:, :, 0] + img[:, :, 1] + img[:, :, 2])/3.0 + 0.001 mask_1 = I > 128.0 r = img [:

随机推荐