吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

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

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

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

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



剪切前后对比



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

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

代码:

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# -*- 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, 2025-4-16 11:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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