Pillow 包实现图片叠加非常简单

简单使用

安装

1
$ pip install Pillow

简单实现

1
2
3
4
5
6
7
from PIL import Image

big_image =Image.open('big.jpg')
small_image=Image.open('small.jpg')
# small_image.thumbnail((400,400)) 可以实现压缩
big_image.paste(small_image,(157, 45))
big_image.show()

原图

Python 使用 Pillow 包实现图片叠加-LMLPHP
Python 使用 Pillow 包实现图片叠加-LMLPHP

叠加效果

Python 使用 Pillow 包实现图片叠加-LMLPHP

项目中使用

在 web 项目中往往我们不会使用本地图片,大多是对网络图片进行处理,再传到线上,所以首先需要能解析网络图片,其次处理后需要拿到图片二进制,再进行上传处理。

这套逻辑的代码在 https://github.com/wxnacy/study/blob/master/python/pillow_demo/overlay.py

这里复制一份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: wxnacy([email protected])
# Description: 图片叠加

import io

from PIL import Image
import requests


def get_image(path):
'''通过地址获取 image 对象'''
image = None
if path.startswith('http'):
res = requests.get(path)
image = Image.open(io.BytesIO(res.content))
else:
image = Image.open(path)
return image

def image2bytes(image):
'''图片转二进制'''
img_bytes = io.BytesIO()
image.save(img_bytes, image.format)
return img_bytes.getvalue()

def overlay(big_path, small_path, width, height, small_thumbnail=()):
'''叠加'''
big_image = get_image(big_path)
small_image = get_image(small_path)
if small_thumbnail:
small_image.thumbnail(small_thumbnail)
big_image.paste(small_image,(width, height))
big_image.show() # 显示图片
# big_image.save('/Users/wxnacy/Downloads/pillow_overlay.png') # 保存
# 或者返回图片的二进制
return image2bytes(big_image)


if __name__ == "__main__":
overlay('https://wxnacy.com/images/rss.png',
'https://wxnacy.com/images/mp.jpg', 157, 45)
03-16 13:17