背景
前几天想要把自己感觉值得留恋的照片统一冲洗出来,但是上网看很多冲洗出来的照片因为本身尺寸不适应冲洗的尺寸要求,经常出现不一致的留白情况。(强迫症非常难受)但是本人过懒,又不想下载什么软件去批量修改,所以干脆考虑自己动手用python来实现。
虽然可能比用现成软件要复杂,但是就当是对自己的一种磨练,毕竟提高动手能力与行动力也很重要!!💪(加上我快忘光了python的语法,菜鸟心痛::>_<::)
网上照片尺寸信息
实验
步骤
1. 将该python文件与需要处理的文件夹放置于同一级目录下
2.运行一下代码
代码
代码1.0
一开始把问题想复杂了,难受😫
from PIL import Image
import time
import os
import random
data_base_dir = r"./unSize" #存放原始图片地址
# 支持1寸、2寸、5寸、6寸,要是不够格式可以自己加
def chooseSize(num):
if num == 1:
return [25, 35]
elif num == 2:
return [35, 53]
elif num == 5:
return [89, 127]
elif num == 6:
return [102, 152]
for file in os.listdir(data_base_dir):
im = Image.open(r"./unSize/" + file)#当前目录下的图片名字
# 图片的宽度和高度
img_size = im.size
print("图片宽度和高度分别是{}".format(img_size))
(Pic_x,Pic_y) = img_size
# 先检测是 横图 还是 竖图
if Pic_x >= Pic_y: # 也就是横着的照片
im = im.rotate(90, expand=1) # expand=1,自动改变长宽尺寸,防止出现黑边
(Pic_x, Pic_y) = im.size
print("转方向之后宽高: " + str(Pic_x) + "," + str(Pic_y))
# 初始裁剪方案
x = 0
y = 0
w = Pic_x
h = Pic_y
# 以中心为准裁剪
if Pic_x/Pic_y <= chooseSize(6)[0]/chooseSize(6)[1]:
final_height = (chooseSize(6)[1]/chooseSize(6)[0]) * Pic_x
adjust = (Pic_y-final_height)/2
h = final_height
y = adjust/2 # 从(x, y)开始截
else :
final_width = (chooseSize(6)[0]/chooseSize(6)[1]) * Pic_y
adjust = (Pic_x-final_width)/2
w = final_width
x = adjust/2 # 从(x, y)开始截
region = im.crop((x, y, x+w, y+h))
region.save("./donePic/_" + str(random.randint(2,100)) + ".jpg")#保存的文件名字
time.sleep(0.1)
代码2.0
为了让代码内容更加简洁,也为了增强代码可复用性,我又做了一下修改
from PIL import Image
import time
import os
import random
data_base_dir = r"./unSize" #存放原始图片地址
"""函数chooseSize支持1寸、2寸、5寸、6寸,要是不够格式可以自己加 2.0 版本 只返回比值"""
def chooseSize(num):
if num == 1:
return 25/35
elif num == 2:
return 35/53
elif num == 5:
return 89/127
elif num == 6:
return 102/152
for file in os.listdir(data_base_dir):
im = Image.open(r"./unSize/" + file)#当前目录下的图片名字
# 图片的宽度和高度
img_size = im.size
print("图片宽度和高度分别是{}".format(img_size))
(Pic_x,Pic_y) = img_size
# 先检测是 横图 还是 竖图
if Pic_x >= Pic_y: # 也就是横着的照片
im = im.rotate(90, expand=1) # expand=1,自动改变长宽尺寸,防止出现黑边
(Pic_x, Pic_y) = im.size
print("转方向之后宽高: " + str(Pic_x) + "," + str(Pic_y))
# 初始裁剪方案
x = 0
y = 0
w = Pic_x
h = Pic_y
# 以中心为准裁剪
if Pic_x/Pic_y <= chooseSize(6):
final_height = (1/chooseSize(6)) * Pic_x
adjust = (Pic_y-final_height)/2
h = final_height
y = adjust/2 # 从(x, y)开始截
else :
final_width = chooseSize(6) * Pic_y
adjust = (Pic_x-final_width)/2
w = final_width
x = adjust/2 # 从(x, y)开始截
region = im.crop((x, y, x+w, y+h))
region.save("./donePic/_" + str(random.randint(2,100)) + ".jpg")#保存的文件名字
time.sleep(0.1)
效果展示
思考
实际上2.0也很粗糙,可以将尺寸切割的代码再一次封装,但是这里就不再修改了。菜鸟一枚,文中若有对代码编写不到位的地方,欢迎指正!❀