吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3651|回复: 11
收起左侧

[Python 转载] PIL批量操作文件,剪切图片

[复制链接]
EchoY 发表于 2022-3-16 12:41
本帖最后由 EchoY 于 2022-3-17 22:25 编辑

因为批量剪切图片需要,找了找没找到轻量合适的工具。就用python写了个批量小工具。

只需要拖拽进文件夹路径,输入要剪切的宽度与高度,选择一下剪切的基点位置。就可以批量剪切该文件夹下所有图片。



剪切前后对比



代码是基于python的PIL库开发的,也算比较简单。

目前支持了4个顶点剪切,从中间位置剪切及整体缩放。

代码:

[Python] 纯文本查看 复制代码
# -*- 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[i])
cut_value = input("裁剪基点:\n")
print("\n----------start----------\n")
print("操作文件夹:", folder, "\n剪切为:", cut_width, "x", cut_height, "(px)", "\n剪切模式为:", cut_list[int(cut_value) - 1], "\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[v]), 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
使用之后在哪里找到修改后的图片呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-5 13:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表