Skip to content

Instantly share code, notes, and snippets.

@lighteternal
Last active April 23, 2023 15:35
Show Gist options
  • Save lighteternal/8d8494261cf92a6755cb7563b691eff5 to your computer and use it in GitHub Desktop.
Save lighteternal/8d8494261cf92a6755cb7563b691eff5 to your computer and use it in GitHub Desktop.
Compress images to ~100kb
import os
from PIL import Image
import shutil
import io
def get_image_size(image, quality=95):
buffer = io.BytesIO()
image.save(buffer, format='JPEG', optimize=True, quality=quality)
return len(buffer.getvalue()) // 1024
def resize_image(source_folder, target_folder, min_target_kb=90, max_target_kb=110):
if not os.path.exists(target_folder):
os.makedirs(target_folder)
for filename in os.listdir(source_folder):
if filename.endswith(('.jpg', '.jpeg', '.png')):
file_path = os.path.join(source_folder, filename)
new_filename = f"resized_{filename}"
new_file_path = os.path.join(target_folder, new_filename)
image = Image.open(file_path)
# Initial resizing
aspect_ratio = float(image.width) / float(image.height)
new_width = int((max_target_kb * 1024) ** 0.5)
new_height = int(new_width / aspect_ratio)
resized_image = image.resize((new_width, new_height), Image.ANTIALIAS)
# Fine-tuning dimensions
current_size_kb = get_image_size(resized_image)
while current_size_kb < min_target_kb:
new_width += 1
new_height = int(new_width / aspect_ratio)
resized_image = image.resize((new_width, new_height), Image.ANTIALIAS)
current_size_kb = get_image_size(resized_image)
if image.mode in ("RGBA", "P"):
resized_image = resized_image.convert("RGB")
resized_image.save(new_file_path, optimize=True, quality=95)
source_folder = 'C:/Users/User/Desktop/images_pre'
target_folder = 'C:/Users/User/Desktop/images_post'
resize_image(source_folder, target_folder)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment