Python实现圆形图片处理,Pillow


前言

前几天,在项目中实现一个生成海报的功能,其中用户头像需要实现为圆形显示样式。

尝试用Python开发一段代码来实现一下。


一、技术要点

开发环境使用Python自带IDE。

1.1 安装开发包

Python用于图像处理的包是,Pillow。如果未安装,先安装Pillow包。
Pillow 是一个Python的图像处理库,它可以用于打开、操作和保存多种图像格式,如JPEG、PNG、BMP、GIF等。Pillow包含了丰富的图像处理功能,比如大小调整、旋转、裁剪、过滤器应用、颜色调整、文本绘制等。Pillow是Python Imaging Library(PIL)的分支版本,提供了更好的性能和广泛的支持。

pip install Pillow

1.2 引入模块

在Python环境中引入Pillow

import PIL
from PIL import Image, ImageDraw, ImageFont

1.2.1 Pillow的Image模块

Pillow的Image模块是处理图像的核心模块之一,其主要作用是打开、操作和保存图像。Image模块支持多种文件格式,如JPEG、PNG、BMP、GIF等,并提供了丰富的图像处理功能,包括调整大小、旋转、裁剪、缩略图、过滤器应用、颜色调整、文本绘制等。通过使用Image模块,可以方便地实现对图像的各种处理和操作,从而满足不同场景下的需求。

1.2.2 Pillow的ImageDraw

Pillow的ImageDraw模块是在图像上绘制2D图形的模块之一,其主要作用是在图像上创建和编辑各种2D形状,如线、矩形、椭圆、多边形等。使用ImageDraw模块需要先创建一个ImageDraw对象,并提供包含图形的坐标、颜色、宽度等参数,然后可以使用该对象对图像进行绘制操作。

ImageDraw模块不仅提供了基本的绘图函数,还支持各种文本处理功能,如在图像上添加文本、调整字体、颜色和大小等。通过使用ImageDraw模块,可以方便地实现对图像的各种2D图形绘制和文本处理,从而满足不同场景下的需求。

1.2.3 Pillow的ImageFont

Pillow的ImageFont模块是用于操作和加载字体的模块之一,其主要作用是提供对不同字体文件的支持,并允许在图像上添加文本时指定字体、大小、颜色等参数。

使用ImageFont模块需要先加载相应字体文件并创建一个字体对象,然后可以将该字体对象传递给ImageDraw模块中的绘图函数以实现在图像上添加指定字体的文本。

ImageFont模块支持多种字体格式,如TrueType(.ttf)、OpenType(.otf)等,并提供了各种字体相关的属性,如字体名称、大小、样式等。通过使用ImageFont模块,可以实现在图像上添加各种字体类型和风格的文本,从而满足不同场景下的需求。

二、需求描述

生成一张宽600,长900的海报。在海报底部,程序自动依据用户信息生成,左边显示头像,头像以圆形显示,头像后面紧跟用户名。右边显示一个二维码,让用户进行扫码。主体为一张设计好的海报图。

总体样式如下:
来玩AI海报底图

2.1 说细设计(距离单位统一为像素)

头像距左边缘50,距离上边缘为723,头像大小为6464,
名称距离左边缘129,距离上边缘740,文字使用8号字
二维码距离左边缘407,距离上边缘683,大小:142
142

其他需求内容(忽略10000字

其他内容均为底图。

三、技术实现

3.1 定义变量参数

变量参数

3.2 结构设计

编写两个函数命名为:CircleImage、GetPoster

3.2.1 CircleImage

函数: CircleImage(img)
输入参数:

  • img 一个正方形图片

返回值:

  • 一张处理成圆形的Image对象

功能:

  • 将图片处理成圆形,其直径等于输入图片最小边长

3.2.2 GetPoster

函数: GetPoster(c,h,n)
输入参数:

  • c: 二维码路径
  • h: 头像路径
  • n: 用户名

返回值:

  • 生成完成的一张海报图片,Image对象

功能:

  • 将二维码,头像,用户名绘制到海报底图上

3.3 编码

3.3.1 CircleImage

def CircleImage(img):
	# 重设尺寸为头像设计尺寸
	Img1 = img.resize(head_sz)
	
	# 将图像转换成RGBA模式。使用图像透明通道。
    img1 = img1.convert("RGBA")
    w, h = img1.size
    
	# 定义alpha通道
    alpha = Image.new("L", img1.size, color=0)
    draw = ImageDraw.Draw(alpha)

    # 绘制一个圆,填充为255,即白色
    draw.ellipse((0,0,w,h),fill=255)

    #应用透明通道到图片上
    img1.putalpha(alpha)
    
    return img1

3.3.2 GetPoster

def GetPoster(c,h,n):
    '''
      c  二维码图片
      h  头像图片
      n  名称
    '''

	# 读取海报底图
	o_poster = Image.open(Img_poster_base)
	o_poster = img_poster.convert("RGBA")
	    
	# 读取二维码图
	o_qr= Image.open(c)
	o_qr= o_qr.convert("RGBA")
	o_qr= o_qr.resize(qr_sz)
	
	# 读取头像图
	o_head = Image.open(h)
	o_head = img_head.resize(hd_sz)
	# 裁剪图像为圆形
	o_head = CircleImage(o_head)
	    
	# 将二维码贴到海报上
	o_poster.paste(o_qr, qr_xy)
	# 将头像贴到海报上 注意这里需要设置mask为目标图片的alpha
	o_poster.paste(o_head, hd_xy, mask=o_head.split()[-1])
	    
	draw = ImageDraw.Draw(o_poster)
	# 配置字体msyh.ttc是“微软雅黑”
	font = ImageFont.truetype('C:\Windows\Fonts\msyh.ttc', 18)
	# 写文字
	draw.text(name_xy, n, fill='white', font=font)
	# draw.text(textXY2, "邀请您一起来玩AI", fill='white', font=font)

    # 生成海报名称
    poster_name = "static/posters/POSTER_%s.png" % uuid.uuid4()
    # 保存海报
    o_poster.save(poster_name)

    # 显示海报
    o_poster.show()

    return poster_name

四、展示效果

4.1 执行结果

在这里插入图片描述

4.2 源代码

请通过以下地址来体验ChatGPT
https://www.zhiyidata.cn/chatgpt/play

源码下载

猜你喜欢

转载自blog.csdn.net/all_night_in/article/details/130556537
今日推荐