Python如何对图片进行缩放,旋转,翻转,添加文字以及如何截取并粘贴图像到图片中

本文介绍了如何使用Python对图片进行缩放、旋转、翻转以及添加文字的操作。通过调用PIL库,可以轻松实现图片的尺寸调整、旋转90度以及内容翻转。此外,还讲解了如何在图片中添加文字,以及如何截取图片内容并粘贴到其他图像上。这些功能对于批量处理图片和快速生成定制化图像非常实用。

Python如何对图片进行缩放,旋转,翻转,添加文字以及如何截取并粘贴图像到图片中

有时候我们需要批量的对图片进行一些简单的处理,比如说,将一些照片调整为统一的尺寸,或者添加一些简单的文字内容到图片或者截图中,用手机操作或者用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度,通过执行这条语句,整个画布才会翻转。

具体的区别如下图如示,调用这两个功能后也需要重新赋值后才能传递旋转后的内容:
测试图片来源于 Unsplash

接下来,简要介绍如何往图片中添加文字

添加文字内容,需要用到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
LeMiaokai@Gmail.com
"""

"""# 第一步, 导入所需要模块"""
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对图片的缩放,旋转,翻转以及添加文字和图片截取粘贴的操作,先简单介绍这些,希望本文内容能对你有所启发,如有不足之处,请指出,谢谢!

### 使用Python进行图像的复制和粘贴 Python 提供了多种图像处理库,如 `Pillow` 和 `OpenCV`,它们可以用于图像的复制和粘贴操作。以下是一个基于 `Pillow` 的示例,展示了如何将一张图像的一部分复制粘贴到另一张图像上。 ```python from PIL import Image # 打开两张图像 image1 = Image.open('copy_paste_00001.jpg') image2 = Image.open('copy_paste_00002.jpg') # 从第一张图像中裁剪出一个区域(例如,裁剪出一个矩形区域) crop_area = (100, 100, 300, 300) # 左上角坐标为(100,100),右下角坐标为(300,300) cropped_image = image1.crop(crop_area) # 将裁剪后的图像粘贴到第二张图像上 paste_position = (50, 50) # 粘贴位置的左上角坐标 image2.paste(cropped_image, paste_position) # 保存处理后的图像 image2.save('pasted_image.jpg') ``` 在实际应用中,还可以结合随机缩放抖动(Scale Jittering)和水平翻转(Horizontal Flipping)来增强数据集[^2]。以下是随机缩放抖动和水平翻转的实现示例: ```python import random # 随机缩放抖动 scale_factor = random.uniform(0.8, 1.2) # 缩放因子在0.8到1.2之间随机 resized_cropped_image = cropped_image.resize((int(cropped_image.width * scale_factor), int(cropped_image.height * scale_factor))) # 水平翻转 flipped_cropped_image = resized_cropped_image.transpose(Image.FLIP_LEFT_RIGHT) # 将处理后的图像粘贴到另一张图像上 image2.paste(flipped_cropped_image, paste_position) # 保存最终结果 image2.save('transformed_pasted_image.jpg') ``` ### 调整标注信息 在图像复制和粘贴操作中,需要调整标注信息。对于边界框(Bounding Box),可以根据缩放因子和粘贴位置调整坐标;对于掩码(Mask),需要确保粘贴区域与目标图像的对应区域一致。以下是边界框调整的示例代码: ```python # 假设原始边界框的坐标为 (x1, y1, x2, y2) x1, y1, x2, y2 = 100, 100, 300, 300 # 根据缩放因子调整边界框 scaled_x1 = int(x1 * scale_factor) scaled_y1 = int(y1 * scale_factor) scaled_x2 = int(x2 * scale_factor) scaled_y2 = int(y2 * scale_factor) # 根据粘贴位置调整边界框 final_x1 = scaled_x1 + paste_position[0] final_y1 = scaled_y1 + paste_position[1] final_x2 = scaled_x2 + paste_position[0] final_y2 = scaled_y2 + paste_position[1] print(f"Adjusted Bounding Box: ({final_x1}, {final_y1}, {final_x2}, {final_y2})") ``` ### 数据集扩充 复制和粘贴方法可以有效扩充数据集,帮助提升模型性能[^2]。通过结合随机缩放抖动、水平翻转以及调整标注信息,可以生成多样化的训练样本。 ```python import os # 扩充数据集 input_dir = 'JPEGImages' output_dir = 'AugmentedImages' os.makedirs(output_dir, exist_ok=True) # 遍历所有图像 for filename in os.listdir(input_dir): if filename.endswith('.jpg'): image_path = os.path.join(input_dir, filename) image = Image.open(image_path) # 进行随机缩放抖动 scale_factor = random.uniform(0.8, 1.2) resized_image = image.resize((int(image.width * scale_factor), int(image.height * scale_factor))) # 进行水平翻转 flipped_image = resized_image.transpose(Image.FLIP_LEFT_RIGHT) # 保存增强后的图像 output_path = os.path.join(output_dir, f'augmented_{filename}') flipped_image.save(output_path) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值