Skip to content

Commit b74cd45

Browse files
Merge pull request #3126 from N9sha18/main
feat: add image compression script using Pillow
2 parents 701daad + 5699e5d commit b74cd45

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

image_compressor.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import os
2+
import sys
3+
from PIL import Image
4+
5+
def compress_image(image_path, quality=60):
6+
"""
7+
Compresses an image by reducing its quality.
8+
9+
Args:
10+
image_path (str): Path to the image file.
11+
quality (int): Quality of the output image (1-100). Default is 60.
12+
"""
13+
try:
14+
# Open the image
15+
with Image.open(image_path) as img:
16+
# Check if file is an image
17+
if img.format not in ["JPEG", "PNG", "JPG"]:
18+
print(f"Skipping {image_path}: Not a standard image format.")
19+
return
20+
21+
# Create output filename
22+
filename, ext = os.path.splitext(image_path)
23+
output_path = f"{filename}_compressed{ext}"
24+
25+
# Save with reduced quality
26+
# Optimize=True ensures the encoder does extra work to minimize size
27+
img.save(output_path, quality=quality, optimize=True)
28+
29+
# Calculate savings
30+
original_size = os.path.getsize(image_path)
31+
new_size = os.path.getsize(output_path)
32+
savings = ((original_size - new_size) / original_size) * 100
33+
34+
print(f"[+] Compressed: {output_path}")
35+
print(f" Original: {original_size/1024:.2f} KB")
36+
print(f" New: {new_size/1024:.2f} KB")
37+
print(f" Saved: {savings:.2f}%")
38+
39+
except Exception as e:
40+
print(f"[-] Error compressing {image_path}: {e}")
41+
42+
if __name__ == "__main__":
43+
if len(sys.argv) < 2:
44+
print("Usage: python image_compressor.py <image_file>")
45+
print("Example: python image_compressor.py photo.jpg")
46+
else:
47+
target_file = sys.argv[1]
48+
if os.path.exists(target_file):
49+
compress_image(target_file)
50+
else:
51+
print(f"Error: File '{target_file}' not found.")

0 commit comments

Comments
 (0)