-
Notifications
You must be signed in to change notification settings - Fork 0
/
BatchConvertDIR2Webp.py
119 lines (92 loc) · 4.22 KB
/
BatchConvertDIR2Webp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import os
from PIL import Image
from tqdm import tqdm
import colorama
from colorama import Fore, Style, init
# Initialize colorama for colorful output
init(autoreset=True)
def format_size(bytes_size):
"""Converts bytes to KB, MB, GB, or TB."""
for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
if bytes_size < 1024:
return f"{bytes_size:.2f} {unit}"
bytes_size /= 1024
def convert_image_to_webp(img_path):
try:
original_size = os.path.getsize(img_path)
img = Image.open(img_path)
img = img.convert("RGB") # Ensure proper conversion to webp
# Define the new file path for the webp image
webp_path = f"{os.path.splitext(img_path)[0]}1.webp"
# Save the image as .webp format
img.save(webp_path, 'webp')
# Return paths and sizes
return img_path, webp_path, original_size
except Exception as e:
print(f"{Fore.RED}Error converting {img_path}: {e}")
return None, None, None
def process_directory(directory):
total_files = 0
converted_files = 0
ignored_files = 0
total_space_saved = 0
to_delete = []
to_rename = []
for root, dirs, files in os.walk(directory):
image_files = [f for f in files if f.lower().endswith(('.jpeg', '.jpg', '.png'))]
webp_files = [f for f in files if f.lower().endswith('.webp')]
# Skip directory if no valid images are found
if not image_files and not webp_files:
continue
total_files += len(image_files) + len(webp_files)
# First Task: Convert images to WebP
with tqdm(total=len(image_files), desc=f"Converting in {root}", bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}]") as pbar:
for image_file in image_files:
img_path = os.path.join(root, image_file)
orig_path, webp_path, original_size = convert_image_to_webp(img_path)
if orig_path and webp_path:
converted_files += 1
new_size = os.path.getsize(webp_path)
total_space_saved += original_size - new_size
# Track files for deletion and renaming
to_delete.append(orig_path)
to_rename.append((webp_path, orig_path)) # Rename 'webp_path' to 'orig_path' after deletion
pbar.update(1)
# Ignoring already converted webp files
ignored_files += len(webp_files)
# Second Task: Delete original image files (JPG/PNG)
print(f"{Fore.YELLOW}Deleting original files...")
for file_path in to_delete:
try:
os.remove(file_path)
except Exception as e:
print(f"{Fore.RED}Error deleting {file_path}: {e}")
print(f"{Fore.GREEN}Conversion complete!")
print(f"{Fore.CYAN}Total detected: {total_files}")
print(f"{Fore.CYAN}Total converted: {converted_files}")
print(f"{Fore.CYAN}Total ignored: {ignored_files}")
print(f"{Fore.CYAN}Total space saved: {format_size(total_space_saved)}")
print(f"{Fore.YELLOW}Build Date: SEPTEMBER 16 2024")
print(f"{Fore.YELLOW}Version: 0.0.1.8")
print(f"{Fore.BLUE}Thanks for using BatchConvertDIR2Webp by noarche!")
print(f"{Fore.BLUE}https://github.com/noarche")
def display_help():
print(f"{Fore.MAGENTA}This script converts .jpeg, .jpg, and .png images to .webp format.")
print("It processes all subdirectories in the provided directory, converting and renaming files.")
print(f"If the image is already in .webp format, it will be ignored.")
print(f"Type 'exit' or 'e' to quit the program.")
def main():
while True:
directory = input(f"{Fore.CYAN}Enter directory or type 'help' for more information: ").strip()
if directory.lower() in ['exit', 'e']:
print(f"{Fore.YELLOW}Exiting program.")
break
if directory.lower() == 'help':
display_help()
continue
if not os.path.isdir(directory):
print(f"{Fore.RED}Invalid directory. Please try again.")
continue
process_directory(directory)
if __name__ == "__main__":
main()