Python 製作縮圖
說明
底下的程式,使用 os.walk取得primitive及thumb目錄下的所有檔案,如果thumb目錄下沒有縮圖時,才把 primitive裏的原圖進行縮圖。
本程式有個特點,就是傳回二個目錄的set,而不是list,因為在
if not p.replace(‘primitive’, ‘thumb’) in primitive 這個判斷式中,如果使用list的話,大約要花1秒多進行比對。但如果用set的話,只要 0.05秒,所以用set快很多。其原因是set 採用 hashcode,所以可以更快的得知是否有 thumb 的縮圖。
代碼
import os
from MahalCv import MahalCv as cv
primitive_path='d:/pictures/primitive'
thumb_path='d:/pictures/thumb'
def dirTree(path):
# 使用set,在 if not p in set 的速度才會快,因為是採用 hashcode
s=set([])
for root, subdirs, files in os.walk(path):
for file in files:
lower = file.lower()
if lower.endswith('.jpg') or lower.endswith('.png') or lower.endswith('.bmp'):
abs = os.path.join(root, file).replace('\\', '/')
s.add(abs)
return s
def make_thumb(path):
#path為原圖
thumb_dir=os.path.dirname(path).replace('primitive', 'thumb')
file=os.path.basename(path)
if not os.path.exists(thumb_dir):os.mkdir(thumb_dir)
img=cv.read(path)
h, w=img.shape[:2]
if w>h:
img=cv.resize(img, 400, int(400/w*h))
else:
img = cv.resize(img, int(400 / h * w), 400)
cv.write(os.path.join(thumb_dir, file), img)
if not os.path.isdir(thumb_path):os.mkdir(thumb_path)
primitive=dirTree(primitive_path)
thumb=dirTree(thumb_path)
for p in primitive:
if not p.replace('primitive', 'thumb') in thumb:
print(f'製作縮圖 : {p}')
make_thumb(p)
