EchoY 发表于 2022-3-16 12:41

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文件也重新打包上传。

EchoY 发表于 2022-3-17 23:01

明次 发表于 2022-3-16 12:56
支持剪切后更换扩展名么

PIL库是支持图片格式转换的,但我还没玩过。在输出图片前再加个格式转换应该就行,你去搜搜相关文档。

EchoY 发表于 2022-3-17 22:32

lyjc1282 发表于 2022-3-17 10:49
所有格式图片都支持吗?

在这里我使用的PIL库操作的图片,PIL库支持的文件格式非常多。我们日常使用jpg,png,bmp完全够了。

明次 发表于 2022-3-16 12:56

支持剪切后更换扩展名么

x3490861464 发表于 2022-3-16 13:06

支持哪些格式的图片?

sheyong 发表于 2022-3-16 14:43

来学习了

lyjc1282 发表于 2022-3-17 10:49

所有格式图片都支持吗?

EchoY 发表于 2022-3-17 22:33

x3490861464 发表于 2022-3-16 13:06
支持哪些格式的图片?

我使用的PIL库操作的图片,PIL库支持的文件格式很多。日常使用的jpg,png,bmp完全够了。

x3490861464 发表于 2022-3-19 12:30

EchoY 发表于 2022-3-17 22:33
我使用的PIL库操作的图片,PIL库支持的文件格式很多。日常使用的jpg,png,bmp完全够了。

好的,谢谢耐心解答

来只芙蓉王 发表于 2022-12-5 17:27

使用之后在哪里找到修改后的图片呢
页: [1] 2
查看完整版本: PIL批量操作文件,剪切图片