类似傻瓜救笨蛋
说起来有点不好意思,这个题目“类似傻瓜救笨蛋”是我自己给自己项目起的外号,因为我总是觉得自己像个笨蛋,然后想用一些“傻瓜式”的方法来解决遇到的问题。这回就说说我最近折腾的一个小项目,关于批量处理图片的。
事情是这样的,我平时喜欢拍点照片,但是拍完之后经常要进行一些简单的处理,比如批量调整大小、加水印什么的。以前都是一张张手动处理,简直要命。后来我就想,能不能自己写个小工具,一键搞定?
说干就干,我寻思着这玩意儿肯定得用Python,毕竟库多嘛
我得把要处理的图片都找出来。我用了 `os` 模块,直接遍历文件夹。
python
import os
def find_images(folder):
images = []
for filename in *(folder):
if *(('.jpg', '.jpeg', '.png', '.gif')):
*(*(folder, filename))
return images
这段代码很简单,就是找到指定文件夹下所有以 `.jpg`, `.jpeg`, `.png`, `.gif` 结尾的文件,然后把它们的完整路径放到一个列表里。
找到了图片,下一步就是调整大小。这里我用了 `PIL` 库(也就是 `Pillow`)。
python
from PIL import Image
def resize_image(image_path, width, height):
try:
img = *(image_path)
img = *((width, height))
*(image_path) # 直接覆盖原图,懒得改名了
print(f"成功调整大小:{image_path}")
except Exception as e:
print(f"调整大小失败:{image_path}, 错误:{e}")
这段代码打开图片,然后用 `resize` 函数调整大小,再保存回去。这里我直接覆盖了原图,省事!正规的做法应该备份或者另存为新文件。
接下来是加水印。水印图片我事先准备好了一个 `.png` 文件。
python
def add_watermark(image_path, watermark_path, opacity=0.5):
try:
img = *(image_path).convert("RGBA")
watermark = *(watermark_path).convert("RGBA")
# 调整水印大小,让它占图片的1/4
watermark_width = int(*[0] / 4)
watermark_height = int(*[1] / 4)
watermark = *((watermark_width, watermark_height))
# 设置水印透明度
watermark = *(lambda p: p opacity)
# 计算水印位置,放在右下角
position = (*[0] - *[0], *[1] - *[1])
# 叠加水印
*(watermark, position, watermark)
*(image_path) # 同样直接覆盖
print(f"成功添加水印:{image_path}")
except Exception as e:
print(f"添加水印失败:{image_path}, 错误:{e}")
这段代码稍微复杂一点,打开原图和水印图,都转成RGBA格式,方便处理透明度。然后我把水印缩放到原图的1/4大小,设置透明度,再把水印放到右下角,叠加到原图上。
我把这些功能串起来,写一个主函数。
python
def main(folder, watermark_path, width, height):
images = find_images(folder)
for image in images:
resize_image(image, width, height)
add_watermark(image, watermark_path)
这个 `main` 函数接收文件夹路径、水印路径、宽度和高度作为参数,然后调用前面的函数,批量处理图片。
完事儿!虽然代码很简陋,但是用起来是真的方便。以后再也不用一张张手动处理图片了。
- 第一步:用 `os` 模块找到所有图片。
- 第二步:用 `PIL` 库调整图片大小。
- 第三步:用 `PIL` 库添加水印。
- 第四步:把所有步骤串起来。
这个小工具还有很多可以改进的地方,比如:
- 可以加个GUI界面,用起来更方便。
- 可以添加更多图片处理功能,比如裁剪、滤镜等等。
- 可以把处理后的图片保存到新的文件夹,而不是直接覆盖原图。
不过对于我这个“笨蛋”来说,能做出这么一个“傻瓜式”的小工具,已经很满足了!哈哈!下次再分享其他折腾的小玩意儿。