PIL批量操作文件,剪切图片
本帖最后由 EchoY 于 2022-3-17 22:25 编辑因为批量剪切图片需要,找了找没找到轻量合适的工具。就用python写了个批量小工具。
只需要拖拽进文件夹路径,输入要剪切的宽度与高度,选择一下剪切的基点位置。就可以批量剪切该文件夹下所有图片。
https://pic.imgdb.cn/item/623163d85baa1a80abbdf826.png
剪切前后对比
https://pic.imgdb.cn/item/623165015baa1a80abbeea8e.jpg
代码是基于python的PIL库开发的,也算比较简单。
目前支持了4个顶点剪切,从中间位置剪切及整体缩放。
代码:
# -*- coding: utf-8 -*-
import os
from PIL import Image
##################################################
folder = input("请拖拽入文件夹:")
cut_width = input("需要保留的宽度(像素):")
cut_height = input("需要保留的高度(像素):")
cut_list = ["整体缩放", "居中剪切", "左上角", "左下角", "右上角", "右下角"]
print("选择剪切基点:")
for i in range(len(cut_list)):
print(i + 1, ":", cut_list)
cut_value = input("裁剪基点:\n")
print("\n----------start----------\n")
print("操作文件夹:", folder, "\n剪切为:", cut_width, "x", cut_height, "(px)", "\n剪切模式为:", cut_list, "\n")
def cut_picture(file_in, width, height, value):
img = Image.open(file_in)
_width, _height = img.size
if width > _width or height > _height:
print("超过图片大小限定!图片尺寸为:", _width, "x", _height, "不可剪至:", width, "x", height)
elif value == "1":# mediary
print("\n==> ", file_in, "=>缩放至:", width, "x", height, "已完成")
# don't cut picture, entire shrink to specify pixel of picture
image = Image.open(file_in)
resized_image = image.resize((width, height), Image.ANTIALIAS)
resized_image.save(file_in)
else:
print("==> ", file_in, "=>", width, "x", height, "已完成")
# 图像从左上角建立坐标系,四个值依次为距左的像素,距顶的像素,从左开始剪切到距离左多少的像素,从顶开始剪切到那里的像素。
# 即(左,上,右,底),构成一个矩形
crop = (0,0,0,0,)
if value == "3":# "leftTop"
crop = (0, 0, width, height)
elif value == "5":# "rightTop":
crop = (_width - width, 0, _width, height)
elif value == "6":# "bottomRight":
crop = (_width - width, _height - height, _width, _height)
elif value == "4":# "bottomLeft":
crop = (0, _height - height, width, _height)
elif value == "2":# "middle"
crop = (int((_width - width) / 2), int((_height - height) / 2), int((_width - width) / 2 + width),
int((_height - height) / 2 + height))
cropped = img.crop(crop)# (left, upper, right, lower)
cropped.save(file_in)
def find_folder(folder_path, width, height, cut_vaule):
folder_name = os.listdir(folder_path)
for v in range(len(folder_name)):
cut_picture(str(folder_path + folder_name), width, height, cut_vaule)# (path,width,height,value)
input("\n\n进程结束.")
find_folder(folder + "\\", int(cut_width), int(cut_height), cut_value)
代码中需要注意一下在PIL中图片是以左上角为坐标系原点。以及4个参数的配置。
也打包了exe文件,不方便跑py脚本的可以玩玩:https://nrhs.lanzoul.com/iqVJE01lxugh
新人初来驾到,可能有诸多不足,希望留言交流学习。复制代码很简单,学习才是其乐无穷。
帖子修改提醒:为打包方便选择,于是改了下变量,但眼睛不太好使。给看错了,代码里写了俩“4”,导致程序运行在选择“4”时候报错。已修改,exe文件也重新打包上传。
明次 发表于 2022-3-16 12:56
支持剪切后更换扩展名么
PIL库是支持图片格式转换的,但我还没玩过。在输出图片前再加个格式转换应该就行,你去搜搜相关文档。 lyjc1282 发表于 2022-3-17 10:49
所有格式图片都支持吗?
在这里我使用的PIL库操作的图片,PIL库支持的文件格式非常多。我们日常使用jpg,png,bmp完全够了。 支持剪切后更换扩展名么 支持哪些格式的图片? 来学习了 所有格式图片都支持吗? x3490861464 发表于 2022-3-16 13:06
支持哪些格式的图片?
我使用的PIL库操作的图片,PIL库支持的文件格式很多。日常使用的jpg,png,bmp完全够了。 EchoY 发表于 2022-3-17 22:33
我使用的PIL库操作的图片,PIL库支持的文件格式很多。日常使用的jpg,png,bmp完全够了。
好的,谢谢耐心解答 使用之后在哪里找到修改后的图片呢
页:
[1]
2