对此次项目中主要涉及到的内容做以下说明:

1、需要收集大量资料(包括收集不同信息和图片);

2、资料太多需要做同样的操作处理(包括修改文件名和修改图片尺寸)。

一、修改文件名

import os
os.listdir      #获取文件夹内文件名
os.rename       #更改文件名

         用到的库和基本用法如上,因为需要获取大量资料,可能会用到H5等相关小程序来作为收集资料的方法。以问卷星为例,在获取并下载资料后可以发现:

1、文件中的图片是以网址的形式存在;

2、图片名都是以自有网站设定的文件名存在。

python 批量处理图片 python图片批量处理器_python

 (这是文件中的图片网址)

python 批量处理图片 python图片批量处理器_python 批量处理图片_02

(这是自由网站设定的文件名) 

        仔细去发现,你可以找到二者的相同序列,以此为思路,设立字典,将对应的文件名替换成键值,就是这次批量修改文件名的思路。

import os
import xlrd
import logging

'''
将图片设定为指定尺寸,并且总体图片内容不变形
设定的尺寸为:750*315
'''
# image_size_h = 315                                  # 设定宽
# image_size_w = 750                                  # 设定长
source_path = "E:\\IT_demand_picture\\"               # 源文件路径
target_path = "E:\\IT_picture\\s\\"                   # 输出目标文件路径
file_S = xlrd.open_workbook('20220228.xlsx','r')      # 打开文件
 
if not os.path.exists(target_path):                   # 如果没有存在目标文件,则创建目录
    os.makedirs(target_path)
    
image_list = os.listdir(source_path)                  # 获取当前文件夹中的文件名                                  

def filename_revise(file,path):
    sht = file.sheets()[0]                            # 获取子工作表
    row1 = sht.row_values(1)                          # 查看每行数据
    start = 1
    nrows = sht.nrows                                 # 获取数据行数
    files = os.listdir(path)    
    def getDictKey_1(dic,value):                      # 取值对应的键放到文件名中
        va = [k for k,v in dic.items() if v == value]
        for i in va:
            return i        
    for i in range(start,nrows):
        urls = {}
        shop_name = sht.cell(i,6).value                # 取excel其中一列的值
        for j in range(18,25):                         # 这是图片地址在文件中保存的位置
            url = sht.cell(i,j).value
            logging.info(url)
            url_n = url.split('_')[-1].split('&')[0]
            urls[shop_name+str(j-17)] = url_n
        for file in files:                             #通过文件名和excel得到的url地址相同序列去做判定,相同则批量修改文件名并保存
            indexf = file.split('_')[-1]
            for url in urls.values():
                if indexf == url:
                    os.rename(path+file,path+getDictKey_1(urls,url)+'.jpg')

filename_revise(file_S,source_path)

二、批量修改图片尺寸(改变尺寸同时图片不变形)

import cv2
cv2.copyMakeBorder         #给图片设置边界框
cv2.imread                 #读取文件(注意读取的文件路径必须为英文)
cv2.resize                 #修改图片大小
cv2.imwrite                #保存图片

        用到的库和用法如上,需要注意的是使用imread读取文件时路径一定要为英文,否则会报错。

        保证图片不变形的情况去修改尺寸思路是这样的,首先先缩放到height或者是width最大的那边,这取决于图片是横图还是竖图,缩小尺寸后按照另外较小的那方尺寸进行切图,这样就能保证图片清晰不变形,并且符合图片尺寸要求。

def resize_size(image,scale_size):                     
#     top,bottom,left,right = (0,0,0,0)
    h,w = image.shape[0],image.shape[1]
    scale = max(h,w)/scale_size                        # 根据边框最大值计算比例
    new_w,new_h = int(w/scale),int(h/scale)
    resize_img = cv2.resize(image,(new_w,new_h))
    if new_w % 2 != 0 and new_h % 2 == 0:              #填充至scale_size * scale_size中
        top, bottom, left, right = (scale_size-new_h)/2, (scale_size-new_h)/2, (scale_size-new_w)/2 + 1, (scale_size-new_w)/2
    elif new_h % 2 != 0 and new_w % 2 == 0:
        top, bottom, left, right = (scale_size-new_h)/2 + 1, (scale_size-new_h)/2, (scale_size-new_w)/2, (scale_size-new_w)/2
    elif new_h % 2 == 0 and new_w % 2 == 0:
        top, bottom, left, right = (scale_size-new_h)/2, (scale_size-new_h)/2, (scale_size-new_w)/2, (scale_size-new_w)/2
    else:
        top, bottom, left, right = (scale_size-new_h)/2 + 1, (scale_size-new_h)/2, (scale_size-new_w)/2 + 1, (scale_size-new_w)/2
    pad_img = cv2.copyMakeBorder(resize_img, int(top), int(bottom), int(left), int(right), cv2.BORDER_CONSTANT, value=[255,255,255])  # 设定图片框架
    pad_img_cut = pad_img[217:532,0:730]               # 需调整参数,以达到切图效果
    return pad_img_cut

i = 0
for file in image_list:                                # 对不同文件格式进行判断,并修改成所需要的同样文件格式
    if '.jpg' in file:
        image_source = cv2.imread(source_path + file)  # 读取图片
        image = resize_size(image_source ,750)         # 缩放裁剪尺寸
        cv2.imwrite(target_path + file, image)         # 重命名并且保存
    elif '.png' in file:
        file = file.replace('png','.jpg')
        image_source = cv2.imread(source_path + file)  # 读取图片
        image = resize_size(image_source ,750)         # 缩放裁剪尺寸
        cv2.imwrite(target_path + file, image)         # 重命名并且保存
    elif '.jpeg' in file:
        file = file.replace('jpeg','.jpg')
        image_source = cv2.imread(source_path + file)  # 读取图片
        image = resize_size(image_source ,750)         # 缩放裁剪尺寸
        cv2.imwrite(target_path + file, image)         # 重命名并且保存
    else:
        pass

        此次批量处理文件就此完成,重要在于思路!

一位在职数据分析师,每个地方都有数据存在!