批量處理照片軟件
批量處理照片軟件
實現(xiàn)功能:
1、指定大小
2、指定照片保存KB大小
3、照片處理日志
無法轉(zhuǎn)換背景顏色,我的算法比較落后效果不好。
我只提供源碼,封裝程序不提供,有能力的可以自己動手,python。
照片處理工具
使用說明:
一、把照片放在原始照片文件夾中

?二、直接運行程序

?三、選擇你需要的照片尺寸,輸出數(shù)字再回車。1-3是已經(jīng)設(shè)計好尺寸,即為顯示尺寸。4是自己輸入尺寸,選擇4后自己手動輸入尺寸,格式為 ?100x200 ?x是小寫X?

四、選擇你需要照片的最大KB,輸出數(shù)字再回車。如小于100則可以寫99?

五、批量輸出照片的照片在輸出文件夾中查看。要看下日志,看是否有沒轉(zhuǎn)成功的,以及照片最終大小。部分照片可能會超過要求的KB,日志都有記錄。

??提示一:該程序無法更換背景顏色,只能批量輸出標(biāo)準(zhǔn)尺寸照片,以及限定KB。更換底色可以在微信小程序標(biāo)準(zhǔn)證件照中完成。
?提示二:水平有限,發(fā)現(xiàn)當(dāng)自定義很怪的參數(shù),會有部分照片轉(zhuǎn)換失敗,比如size:1000x2500,大小只允許50kb,推測報錯的原因無法生成只有50kb以內(nèi)的這么大的照片。當(dāng)然沒轉(zhuǎn)成功的都可以查看日志,手動去專業(yè)軟件轉(zhuǎn)。
???升級日志:
V1.3
增加指定照片小于KB數(shù)量
V1.2
1、增強適配性,輸出照片的尺寸可以手動選擇和自定尺寸輸出。
?
V1.1升級文檔
1、解決原始照片無法打開報錯問題。
2、加入運行日記,記錄運行過程,修改圖片失敗的圖片名字。保存在輸出照片文件中。運行日志如下:
?
Pythony源碼: ?V1.3版本
from PIL import Image
import os
import logging
import sys
import time
?
def resize_images(input_folder_path, output_folder_path, size, max_size_kb):
????if not os.path.exists(output_folder_path):
????????os.mkdir(output_folder_path)
?
????logger = logging.getLogger(__name__)
????logger.setLevel(logging.INFO)
?
????file_handler = logging.FileHandler(os.path.join(output_folder_path, "運行日志.csv"))
????file_handler.setLevel(logging.INFO)
?
????formatter = logging.Formatter('%(message)s')
????file_handler.setFormatter(formatter)
?
????logger.addHandler(file_handler)
?
????processed_count = 0
????skipped_count = 0
????error_count = 0
????output_size_kb_count = 0
?
????for filename in os.listdir(input_folder_path):
????????input_image_path = os.path.join(input_folder_path, filename)
?
????????valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.gif')
????????if not input_image_path.lower().endswith(valid_extensions):
????????????skipped_count += 1
????????????logger.info(f"已經(jīng)處理 {filename}")
????????????continue
?
????????try:
????????????with Image.open(input_image_path) as original_image:
????????????????width, height = original_image.size
?
????????????????resized_image = original_image.resize(size)
????????????????output_image_path = os.path.join(output_folder_path, os.path.splitext(filename)[0] + '.jpg')
?
????????????????# 檢查輸出文件大小是否超過指定大小,如果超過則降低質(zhì)量
????????????????while os.path.exists(output_image_path) and os.path.getsize(output_image_path) > max_size_kb * 1024:
????????????????????quality = resized_image.info['quality']
????????????????????if quality > 5:
????????????????????????quality -= 5
????????????????????resized_image.save(output_image_path, 'JPEG', quality=quality)
????????????????else:
????????????????????try:
????????????????????????resized_image.save(output_image_path, 'JPEG')
????????????????????except OSError:
????????????????????????output_image_path = os.path.join(output_folder_path, os.path.splitext(filename)[0] + '.png')
????????????????????????resized_image.save(output_image_path, 'PNG')
????????????????????????with Image.open(output_image_path) as png_img:
????????????????????????????if png_img.format == 'PNG':
?
????????????????????????????????if png_img.mode != 'RGB':
????????????????????????????????????png_img = png_img.convert('RGB')
?
????????????????????????????????os.remove(output_image_path)
????????????????????????????????output_image_path = os.path.splitext(output_image_path)[0] + '.jpg'
????????????????????????????????png_img.save(output_image_path, 'JPEG')
????????????????output_size_kb = os.path.getsize(output_image_path) / 1024
????????????????if output_size_kb > max_size_kb:
????????????????????output_size_kb_count += 1
????????????????????logger.info(f"已經(jīng)處理 {filename}({output_size_kb:.2f} KB),KB已經(jīng)無法再降")
????????????????else:
????????????????????logger.info(f"已經(jīng)處理 {filename}({output_size_kb:.2f} KB)")
????????????????processed_count += 1
????????except Exception as e:
????????????error_count += 1
????????????logger.error(f"錯誤圖片 {filename}")
?
????logger.info(f"已經(jīng)處理 {processed_count} 照片, ?KB超標(biāo) { output_size_kb_count} 張照片,未讀取 {skipped_count} 照片, 發(fā)現(xiàn) {error_count} 錯誤圖片.")
?
?
????print(f"已經(jīng)處理 {processed_count} 照片, KB超標(biāo) { output_size_kb_count} 張照片,未讀取 {skipped_count} 照片, 發(fā)現(xiàn) {error_count} 錯誤圖片。詳細(xì)信息請查看日志文件。")
?
if __name__ == '__main__':
????input_folder_path = os.path.join(os.getcwd(), '原始照片')
????output_folder_path = os.path.join(os.getcwd(), '輸出照片')
?
????print("請選擇要使用的尺寸選項:")
????print("1. 295x413 (1寸照片)")
????print("2. 413x579 (2寸照片)")
????print("3. 413x626 (大2寸照片)")
????print("4. 自定義尺寸")
?
????while True:
????????try:
????????????size_option = int(input("請輸入選項數(shù)字: "))
????????????if size_option in [1, 2, 3, 4]:
????????????????break
????????????else:
????????????????print("無效選項,請重新輸入。")
????????except ValueError:
????????????print("無效選項,請重新輸入。")
?
????if size_option == 1:
????????size = (295, 413)
????elif size_option == 2:
????????size = (413, 579)
????elif size_option == 3:
????????size = (413, 626)
????elif size_option == 4:
????????while True:
????????????try:
????????????????size_str = input("請輸入自定義尺寸(格式:100x100,x是小寫):")
????????????????width, height = map(int, size_str.split('x'))
????????????????size = (width, height)
????????????????break
????????????except ValueError:
????????????????print("無效的尺寸選項,請重新輸入。")
????else:
????????print("請重新啟動程序")
????????sys.exit(1)
?
????while True:
????????try:
????????????max_size_kb = int(input("請輸入輸出照片的最大大?。▎挝唬篕B): "))
????????????break
????????except ValueError:
????????????print("無效的大小選項,請重新輸入。")
?
????try:
????????resize_images(input_folder_path, output_folder_path, size, max_size_kb)
????except Exception as e:
????????logging.error(f"處理照片時出錯: {str(e)}")
????????print("處理照片時出錯,請查看日志文件獲取更多信息。")
????????sys.exit(1)
?
time.sleep(6)