網站首頁 編程語言 正文
利用線程生成縮略圖;
讀取當前路徑下的png文件,在當前路徑下生成6464,128128和32*32的縮略圖。
"""
利用線程生成縮略圖
讀取當前路徑下的png文件,在當前路徑下生成64*64,128*128和32*32的縮略圖
"""
import glob
import os
import threading
from PIL import Image
def generate_thumbnail(infile, size):
"""生成指定圖片文件的縮略圖"""
file, ext = os.path.splitext(infile)
file = file[file.rfind('/') + 1:] # 查找文件名
outfile = f'{file}_{size[0]}_{size[1]}{ext}' # 生成縮略圖的文件名
img = Image.open(infile)
img.thumbnail(size, Image.ANTIALIAS) # 進行縮略圖 size為元組 Image.ANTIALIAS表示低質量
img.save(outfile)
def main():
"""主函數"""
for infile in glob.glob('*.png'): # 查找當前路徑下的png文件
for size in (32, 64, 128): # 利用線程生成多個尺寸的縮略圖
# 創建并啟動線程
threading.Thread(
target=generate_thumbnail,
args=(infile, (size, size))
).start()
if __name__ == '__main__':
main()
補充:python 縮放并裁剪圖片 制作圖片縮略圖
說明
現在有一文件夾中存在許多分辨率不同的圖片或文件夾,需要裁剪至指定大小以便作為網頁中的圖片縮略圖。
cut 函數,將圖片裁剪為指定大小,統一分辨率,縮放后取圖片中間部分,超出的部分直接裁剪掉。
還有一個函數 cut2,為等比縮放至x或y為定值。
用法
縮放裁剪后的x、y像素值在代碼開始部分更改即可。
默認只使用 cut 函數,使用 cut2 函數時需在代碼第18-20行更改。
注意:
1.縮放裁剪后會覆蓋原文件,需要的話,請在縮放裁剪前備份圖片。
2.沒有做文件夾驗證,請確認輸入正確的文件夾路徑,并確保文件夾中只有圖片。
3.多次縮放可能會使圖片變得模糊,尤其是文字邊緣。
完整代碼
import cv2
import os
import numpy as np
# cut 裁剪后的 xy
target_x = 286
target_y = 203
def get_dir(dir):
?? ?""" 遍歷文件夾下所有的文件名 """
?? ?list1 = os.listdir(dir)
?? ?for l in list1:
?? ??? ?l = f'{dir}/{l}'
?? ??? ?if(os.path.isdir(l)):
?? ??? ??? ?get_dir(l)
?? ??? ?else:
?? ??? ??? ?cut(l)
?? ??? ??? ?# cut2(l,x=800)
?? ??? ??? ?# cut2(l,y=400)
def cut(inputdir = './t.jpg'):
?? ?""" 圖片裁剪 """
?? ?# 裁剪后的文件名為
?? ?# outputdir = inputdir[:-4] + '_over.jpg'
?? ?# 設置為相同文件名,覆蓋原文件
?? ?outputdir = inputdir
?? ?# img = cv2.imread(inputdir)?? ?# imread讀取不能包含中文文件名
?? ?img = cv2.imdecode(np.fromfile(inputdir, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
? ? # imdecode讀取圖像默BGR通道排列,?
? ? # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)?? ?# 轉換為RGB
?? ?# img.shape:[height,width,channel]
?? ?in_y, in_x = img.shape[:2]
?? ?print(img.shape)
?? ?scale = target_x / target_y
?? ?scale1 = in_x / in_y
?? ?if(scale1 >= scale):
?? ??? ?size = (int(in_x/(in_y/target_y)), target_y)
?? ??? ?# print(1, size)
?? ?elif(scale1 < scale):
?? ??? ?size = (target_x, int(in_y/(in_x/target_x)))
?? ??? ?# print(2, size)
?? ?else:
?? ??? ?size = (target_x, target_y)
?? ??? ?print('error')
?? ?# 縮放到size=(x,y)
?? ?resized = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
?? ?# 展示裁剪后的圖片
?? ?# cv2.imshow('image', resized)
?? ?# cv2.waitKey(0)
?? ?# print('x', resized.shape[1], 'y', resized.shape[0])
?? ?if(resized.shape[1] == target_x):
?? ??? ?# x=target_x
?? ??? ?y0 = resized.shape[0] // 2 - target_y//2
?? ??? ?y1 = y0 + target_y
?? ??? ?x0 = 0
?? ??? ?x1 = target_x
?? ?if(resized.shape[0] == target_y):
?? ??? ?# y=target_y
?? ??? ?y0 = 0
?? ??? ?y1 = target_y
?? ??? ?x0 = resized.shape[1] // 2 - target_x//2
?? ??? ?x1 = x0 + target_x
?? ?output_img = resized[y0:y1, x0:x1]
?? ?# cv2.imwrite(outputdir, output_img)?? ?# imwrite保存文件名不能包含中文
?? ?cv2.imencode('.jpg', output_img)[1].tofile(outputdir)
def cut2(inputdir = './t.jpg', x=0, y=0):
?? ?""" 等比縮放,不裁剪 """
?? ?# outputdir = inputdir[:-4] + '_over.jpg'
?? ?outputdir = inputdir
?? ?img = cv2.imdecode(np.fromfile(inputdir, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
?? ?in_y, in_x = img.shape[:2]
?? ?if(x):
?? ??? ?# 等比縮小為x=
?? ??? ?fxy = x/in_x
?? ?elif(y):
?? ??? ?# 等比縮小為y=
?? ??? ?fxy = y/in_y
?? ?else:
?? ??? ?fxy = 1
?? ?# 按比例縮放,fx:x軸縮放比例,fy:y軸縮放比例
?? ?output_img = cv2.resize(img, (0,0), fx=fxy, fy=fxy, interpolation=cv2.INTER_AREA)
?? ?cv2.imencode('.jpg', output_img)[1].tofile(outputdir)
if __name__ == "__main__":
?? ?original_dir = input('文件夾路徑:')
?? ?get_dir(original_dir)
原文鏈接:https://blog.csdn.net/while10/article/details/124825337
相關推薦
- 2022-03-19 基于React?Hooks的小型狀態管理詳解_React
- 2023-01-28 Python進程間通訊與進程池超詳細講解_python
- 2023-06-04 React中的合成事件是什么原理_React
- 2022-10-29 vite 配置 @ 路徑別名
- 2022-08-10 對WPF中的TreeView實現右鍵選定_C#教程
- 2023-02-14 C++關于字符的接收與輸出操作示例_C 語言
- 2022-07-29 C++超詳細講解字符串類_C 語言
- 2022-12-07 C語言實現堆的簡單操作的示例代碼_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支