有时候我们需要批量的对图片进行一些简单的处理,比如说,将一些照片调整为统一的尺寸,或者添加一些简单的文字内容到图片或者截图中,用手机操作或者用PS之类的工具感觉很麻烦。比如最近由于疫情的原因,学校经常需要家长,把健康码,通行码等内容加上名字后,发给学校,每次都要重复的把同样的文字添加到截图上去很不方便。而使用Python,只要写几段代码就可以只用几秒钟就完成,这部分的代码我放到了另一篇文章「通过Python在健康码,行程卡的截图上添加文字内容,省心省力」中,如有需要,请点击查看。
接下来,本文将通过调用Python代码对图片的一些基本操作进行简要说明:
#开始之前,先要导入所需要模块
from PIL import Image, ImageDraw, ImageFont
关于图片的缩放比较容易理解,但是要注意的是,仅调用缩放函数并不会改变当前图像的尺寸,需要通过重新赋值才可以完成缩放内容的传递,官方文档中的说明是,Returns a resized copy of this image. 就是返回一个本图像调整尺寸后的复制内容。关于图片缩放后的尺寸设定,可以参考如下代码,图片尺寸只能是整数:
# 获取图片的原始尺寸,再按一定的比例进行设定
size = (int(img.size[0] * 0.5), int(img.size[1] *0.5))
# 和上一句的意思一样, 上一句是×50%后取整,这里是除2后取整
size = (img.size[0] // 2, img.size[1] // 2)
#设定尺寸为800*600
size = (800,600)
#将图像Img 调整尺寸后 重新赋值给自己,size的内容任选上述一种即可。
img = img.resize(size)
关于图像的旋转,有时候容易出现理解偏差,rotate是旋转,Transpose是变换位置,本文用翻转来指代。这两个功能的说明如下:
img.rotate(90) 是旋转90度,
这里要注意,只是对于图像内容进行旋转,图片文件本身(或者可以理解为画布)并不会旋转。Image.Transpose.ROTATE_90,是翻转90度,通过执行这条语句,整个画布才会翻转。
具体的区别如下图如示,调用这两个功能后也需要重新赋值后才能传递旋转后的内容:
添加文字内容,需要用到PIL的ImageDraw, ImageFont模块,主要的代码如下:
# 如果需要在图片上添加文字,可以通过ImageDraw来进行操作
draw = ImageDraw.Draw(img)
# 添加文字前还设置需要设定字体以及文字格式,包括字号
fontpath = "font/simsun.ttc"
fontStyle = ImageFont.truetype(fontpath, 80)
# 调用添加文字的函数,所需参数分别是:位置,文字内容,颜色,字体
draw.text(( (2350+270), (1280+150)), "〈- 截取此方块", (255,255,255), font=fontStyle)
关于截取图片中的内容,可能会有比较多的方式,这里只介绍如何截取矩形区域的图像,代码只有一句,就是指定矩形区域的左上角位置和右下角的位置,具体如下:
# 比如左上角的点位坐标为 横向x=2350,竖向y=1280,
# 右下角的位置,则可以是左上角的位置+长和宽,比如这里的长270,和宽260
# 图像截取后,赋值给一个新的变量。
img_cut = img.crop((2350, 1280, (2350+270), (1280+260)))
这里通过循环语句将截取的内容旋转后放到指定的位置,效果如下图所示:
以上就是关于Python如何对图像进行缩放,旋转,翻转,以及文字添加和图片的截取等操作的简要说明,以下是全部的相关代码:
"""
Title : Resize, Rotate, Transpose and Put Text on Image
Author: Le Miaokai
Date : 2022-10-19
[email protected]
"""
"""# 第一步, 导入所需要模块"""
from PIL import Image, ImageDraw, ImageFont
"""# 第二步, 读取本地图片文件,并显示图片文件的基本信息(本案例中的图片来源于 Unsplash)"""
# 用于测试的图片原文件完整路径,只写名字表示与代码在同一文件夹
img_path =r"Test_pic.jpg"
# 读取原图片文件,并显示图片文件的一些基本信息,文件大小,格式以及格式描述
img = Image.open(img_path)
print(img.size)
print(img.format)
print(img.format_description)
"""# 第三步, 将图像翻转90度,并缩小比例后存储为新的图像文件"""
# 用于存放测试1生成的图片,这里用于存放图片尺寸缩小,并旋转90度之后的文件。
img1_path = r"Test_pic1.jpg"
# 通过transpose,将图片转置90度,画面和图片文件,都旋转了90度。正常。
# Deprecation Warning: ROTATE_90 is deprecated and will be removed in Pillow 10 (2023-07-01). Use Transpose.ROTATE_90 instead.
#img1 = img.rotate(90)
img1 = img.transpose(Image.Transpose.ROTATE_90)
# 设定图片缩小后的尺寸大小,这里为各缩小50%, 也直接设定缩放后的图片尺寸
size = (int(img1.size[0] * 0.5), int(img1.size[1] *0.5))
img1 = img1.resize(size)
# 将原图片,缩小尺寸后,另保存为img1
img1.save(img1_path)
"""
这里需要注意两点:
1 . img.resize() 不会直接改变当前图片img的内容,而是会生成一个新的图片内容,所以需要赋值才可以获取到改变尺寸后的图片
比如:img1 = img.resize(size)
2 . img.rotate(90),可以让图像旋转90度,但是画布仍然是原先的尺寸,所以图片旋转后保存的话,整个图片文件的尺寸没有变化,只是图像旋转了。如下图一所示
所以,如果通过img1 = img.rotate(90)这句代码,得不到整个图片旋转90度的效果,需要采用img1 = img.transpose(Image.Transpose.ROTATE_90)来完成。
"""
"""# 第四步, 往原图片中添加文字注释,并加添加文字内容后的图片保存到新的图片文件中"""
# 如果需要在图片上添加文字,可以通过ImageDraw来进行操作
draw = ImageDraw.Draw(img)
#设置需要显示的字体
fontpath = "font/simsun.ttc"
fontStyle = ImageFont.truetype(fontpath, 80)
# 所需参数分别是:位置,文字内容,颜色,字体
draw.text(( (2350+270), (1280+150)), "〈- 截取此方块", (255,255,255), font=fontStyle)
# 用于存放测试2生成的图片,这里用于存放,在图片中添加文字内容后的图像
img2_path = r"Test_pic2.jpg"
img.save(img2_path)
"""# 第五步, 从原始图片文件中,截取一块内容,粘贴到图像中,并保存为新的图像文件"""
# 从原图片img中截取具体位置的图像内容,坐标点分别为x1,y1,左上角的位置点,x2,y2右下角的位置点
# 本案例中截取的是红色的方块,位置如图片如示
img_cut = img.crop((2350, 1280, (2350+270), (1280+260)))
# 通过循环语句,将img3 贴到存放原图片的变量中,
for x in range(1,7):
for y in range(1,3):
# 将img3贴到img中,其中+100,为图片间距
img.paste(img_cut, ((260+100) * y , (270+100) * x))
# 每次贴图后,将截图区域旋转60度,
img_cut = img_cut.rotate(60)
# 通过生成的图像,可以看出,虽然通过rotate可以将截取的图片旋转任意角度,但是图片旋转之后的底色仍然会保留,本案例中底色是黑色
# 另外,当图片旋转后,被截除的部分,将不会再通过旋转函数恢复,本案例设置了每次旋转60度,效果如图所示。
# 用于存放测试3生成的图片,这里用于存放在图片中添加截取内容后的图像文件。
img3_path = r"Test_pic3.jpg"
# 将图片缩小到原图1/2的大小。
img3 = img.resize((img.size[0] // 2, img.size[1] // 2))
# 保存图片。
img3.save(img3_path)
关于python对图片的缩放,旋转,翻转以及添加文字和图片截取粘贴的操作,先简单介绍这些,希望本文内容能对你有所启发,如有不足之处,请指出,谢谢!