1. 图像裁剪
裁剪概念及其应用
好啦,让我们来了解一下如何裁剪和旋转图像。这可是个很实用的技能, 不管是准备网站图形还是为社交媒体创建内容都用得上。
图像裁剪就像是把照片里不需要的边框去掉,专注于主要的主体。想象一下, 你拍了一张很棒的日落照片,但边角处意外有路人甲。通过裁剪, 你能轻松搞定他们(虚拟地搞定啦,别误会)。
方法 crop()
方法 crop() 接受一个矩形区域的坐标,表示你想从图像中裁剪出的部分。 坐标由四个值组成:(左, 上, 右, 下)。
# 裁剪图像
cropped_image = image.crop((100, 100, 400, 400))
# 保存裁剪后的图像
cropped_image.save("cropped_example.jpg")
在这个例子里,图像将被裁剪到从左上角坐标 (100, 100) 到右下角坐标 (400, 400) 的区域。该方法会从原始图像中创建一个新的图像。
基于图像尺寸的动态裁剪
如果你想裁剪图像的中心部分,可以根据尺寸计算裁剪的坐标:
width, height = image.size
left = (width - 200) / 2
top = (height - 200) / 2
right = (width + 200) / 2
bottom = (height + 200) / 2
center_cropped_image = image.crop((left, top, right, bottom))
center_cropped_image.save("center_cropped_example.jpg")
这段代码会裁剪出尺寸为 200x200 像素的图像中心部分。坐标的计算可以确保 裁剪区域精确位于图像中央。
2. 图像旋转
图像旋转可以改变其方向,这在纠正照片方向错误或制造艺术效果时非常有用。
方法 rotate()
方法 rotate() 根据给定的角度逆时针旋转图像。角度以度数表示, 该方法会创建一个新的旋转后的图像。
# 图像逆时针旋转90度
rotated_image = image.rotate(90)
rotated_image.save("rotated_90_example.jpg")
在这个例子中,图像会被逆时针旋转90度。当然你也可以指定其他角度(比如45、180或270度) 来达到想要的效果。
控制旋转时的白边
默认情况下,rotate() 会在图像边缘添加白边(如果使用 RGBA 模式则是透明边), 这样可以保留图像的全部内容。如果你想图像填满整个框而没有边框,可以使用参数 expand=True。
# 使用扩展旋转图像以填满整个框
rotated_expanded_image = image.rotate(45, expand=True)
rotated_expanded_image.save("rotated_expanded_example.jpg")
在这种情况下,Pillow 会增加图像尺寸来容纳其所有内容, 这在以非标准角度(比如45度)旋转时非常有用。
3. 图像镜像
镜像可以水平或垂直翻转图像。当你想改变照片中物体的方向或创造对称效果时, 镜像操作会派上用场。
方法 transpose()
方法 transpose() 支持镜像操作,并支持以下参数:
Image.FLIP_LEFT_RIGHT: 水平翻转。Image.FLIP_TOP_BOTTOM: 垂直翻转。
# 水平翻转
flipped_horizontal = image.transpose(Image.FLIP_LEFT_RIGHT)
flipped_horizontal.save("flipped_horizontal_example.jpg")
# 垂直翻转
flipped_vertical = image.transpose(Image.FLIP_TOP_BOTTOM)
flipped_vertical.save("flipped_vertical_example.jpg")
这些命令会分别水平和垂直翻转图像,可用于各种效果或修正方向。
裁剪、旋转和镜像的实际应用示例
- 聚焦图像的特定区域: 裁剪可以突出图像中你需要的部分, 适合创建人像、去除不必要的细节以及为社交媒体或网站准备图像。
- 修正图像方向: 旋转操作可用于修正照片的方向, 特别是在设备拍摄时方向错误的情况下。例如,将以横向拍摄的图像 校正为纵向以便发布。
- 创造对称效果: 镜像常用于设计中,用于创建对称图像、有趣的视觉效果, 或提升构图。
4. 常见错误及如何避免
使用 Pillow 时可能会遇到一些错误,初学者可能会经常碰到。 比如尝试裁剪超出图像实际尺寸的区域。请始终检查图像尺寸, 并确保裁剪的坐标在其范围内。
另一个细节是,当旋转图像时,如果使用方法 `rotate` 而没有额外设置, 图像可能看起来被裁掉。这是因为旋转时图像尺寸发生了变化。 为避免这种情况,可以使用参数 expand=True 来自动调整尺寸:
# 旋转图像45度并扩展以避免角落被裁掉
rotated_image = image.rotate(45, expand=True)
rotated_image.save("rotated_expanded.jpg")
GO TO FULL VERSION