python PIL库对图片按比例进行分割

不做过多解释,请自行理解 ,其中CheckPixel方法可以删掉,写这个方法的目的是为了排除透明的块,使得图片资源尽可量的小

# -*- coding: utf-8 -*-
from PIL import Image
import struct
import sys
import os

num = 0

def CheckPixel(region):
    x, y = region.size
    empty_box = Image.new('RGBA', (int(x + 1), int(y + 1)))
    empty_box.paste(region,(0,0))
    width, height = empty_box.size
    pix_array = empty_box.load()
    for i in range(width):
        for j in range(height):
            tuple = pix_array[i, j]
            if len(tuple) == 4:
                if tuple[3] != 0:   # 非透明
                    return False
    return True   # 透明

def CutImg(imgPath, imgSaveDir, widthNum, heightNum, imgName):
    global num
    num +=1
    img = Image.open(imgPath)
    size = img.size
    width = float(size[0]) / widthNum
    height = float(size[1]) / heightNum
    print(num, ' Image name: ', imgName, ' (宽,高):',size, ' 切割后 (宽,高): ',(width, height) , '\n')
    for i in range(widthNum):
        for j in range(heightNum):
            box = (width * j, height * i, width * (j + 1), height * (i + 1))
            region = img.crop(box)

            if CheckPixel(region):  # 检查是否透明,透明不存储
                continue

            new_i = i
            new_j = j
            if i < 10:
                new_i = '0' + str(i)
            if j < 10:
                new_j = '0' + str(j)
            region.save(imgSaveDir + '\\' + imgName.split('.')[0] + '_{}{}.png'.format(new_i, new_j))


def TraverseDir(now_Dir, new_dir, widthNum, heightNum):
    try:
        if not os.path.exists(new_dir):
            os.mkdir(new_dir)
        for roots, dirs, files in os.walk(now_Dir):
            # 操作根目录下的图片
            for imgName in files:
                if imgName.endswith('png') or imgName.endswith('jpg'):
                    # imgNum = imgName.split('.')[0]
                    imgSaveDir = new_dir  # 仅仅为了展示字段的作用
                    if not os.path.exists(imgSaveDir):
                        os.mkdir(imgSaveDir)
                    imgPath = roots + '\\' + imgName
                    CutImg(imgPath, imgSaveDir, widthNum, heightNum, imgName)
            if len(dirs) != 0:
                for dir in dirs:
                    new_nowDir = now_Dir + '\\' + dir
                    new_newDir = new_dir + '\\' + dir
                    TraverseDir(new_nowDir, new_newDir, widthNum, heightNum)
                break
            else:
                break

    except IOError:
        print("执行出错,请退出重新尝试!!!")


if __name__ == '__main__':
    print("start...")
    print()

    widthNum, heightNum = map(int, input('请输入要切割的比例,比如3*3,请输入3 3(中间以空格分开): \n\n').split(' '))

    exedir_root = sys.argv[0][:-11]

    basedir = sys.argv[1]
    dirname = basedir.split('\\')[-1]

    new_dir = exedir_root + '\\' + dirname + '_cut'

    print('---------------------------------------------------------')
    print('\n原路径:  ', basedir)
    print('\n保存路径: ', new_dir, '\n')
    print('---------------------------------------------------------\n')

    TraverseDir(basedir, new_dir, widthNum, heightNum)


    # TraverseDir('C:\\Users\Administrator\Desktop\新建文件夹\\1', 'C:\\Users\Administrator\Desktop\新建文件夹\\1_cut', 3,3)

    print('\n---------------------------------------------------------\n')

    print('切割的图片总数为:%d \n' % num)

    print('已完成!!!')
    os.system("pause")



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值