前言
前段时间在一个朋友那么得到的灵感,想到可以用音乐播放页面作为一张海报图片。其实接下来要讲的和海报还是有差距的,而具体实现也只是简单的图片粘贴,但是在效果上还是不错的。效果图如下,希望大家喜欢:
左边是原图,右边是需要添加到中间的图,也是图的主角。其实如果直接用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 # 图片的大小 c<b style="color:transparent">本文来源gao@!dai!ma.com搞$$代^@码!网!</b>ircle_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