146 lines
5.3 KiB
Python
146 lines
5.3 KiB
Python
"""
|
|
Performance test script to compare optimization effects
|
|
测试脚本:对比优化前后的性能
|
|
"""
|
|
|
|
import base64
|
|
import time
|
|
from PIL import Image
|
|
import io
|
|
|
|
def test_compression(image_path, max_sizes=[None, 4096, 2048, 1536], qualities=[100, 95, 85, 75]):
|
|
"""
|
|
Test different compression settings
|
|
"""
|
|
print(f"\n{'='*70}")
|
|
print(f"Testing image: {image_path}")
|
|
print(f"{'='*70}\n")
|
|
|
|
# Load original image
|
|
original_img = Image.open(image_path)
|
|
if original_img.mode != 'RGB':
|
|
original_img = original_img.convert('RGB')
|
|
|
|
orig_width, orig_height = original_img.size
|
|
print(f"Original size: {orig_width}x{orig_height}")
|
|
|
|
# Get original file size
|
|
with open(image_path, 'rb') as f:
|
|
original_file_size = len(f.read()) / 1024
|
|
print(f"Original file size: {original_file_size:.1f} KB\n")
|
|
|
|
results = []
|
|
|
|
for max_size in max_sizes:
|
|
for quality in qualities:
|
|
# Prepare image
|
|
img = original_img.copy()
|
|
|
|
# Resize if needed
|
|
if max_size is not None:
|
|
width, height = img.size
|
|
if max(width, height) > max_size:
|
|
if width > height:
|
|
new_width = max_size
|
|
new_height = int(height * (max_size / width))
|
|
else:
|
|
new_height = max_size
|
|
new_width = int(width * (max_size / height))
|
|
|
|
resize_start = time.time()
|
|
img = img.resize((new_width, new_height), Image.LANCZOS)
|
|
resize_time = time.time() - resize_start
|
|
else:
|
|
new_width, new_height = width, height
|
|
resize_time = 0
|
|
else:
|
|
new_width, new_height = img.size
|
|
resize_time = 0
|
|
|
|
# Compress and encode
|
|
buffer = io.BytesIO()
|
|
|
|
encode_start = time.time()
|
|
img.save(buffer, format="JPEG", quality=quality, optimize=True)
|
|
encode_time = time.time() - encode_start
|
|
|
|
img_bytes = buffer.getvalue()
|
|
compressed_size_kb = len(img_bytes) / 1024
|
|
|
|
# Base64 encode
|
|
base64_start = time.time()
|
|
base64_str = base64.b64encode(img_bytes).decode('utf-8')
|
|
base64_time = time.time() - base64_start
|
|
base64_size_kb = len(base64_str) / 1024
|
|
|
|
# Total time
|
|
total_time = resize_time + encode_time + base64_time
|
|
|
|
# Compression ratio
|
|
compression_ratio = (1 - compressed_size_kb / original_file_size) * 100 if original_file_size > 0 else 0
|
|
|
|
result = {
|
|
'max_size': max_size or 'Original',
|
|
'quality': quality,
|
|
'dimensions': f"{new_width}x{new_height}",
|
|
'compressed_size_kb': compressed_size_kb,
|
|
'base64_size_kb': base64_size_kb,
|
|
'total_time': total_time,
|
|
'compression_ratio': compression_ratio
|
|
}
|
|
results.append(result)
|
|
|
|
print(f"Max Size: {str(max_size or 'Original'):>8} | Quality: {quality:>3}% | "
|
|
f"Dimensions: {new_width:>4}x{new_height:<4} | "
|
|
f"Size: {compressed_size_kb:>6.1f}KB (base64: {base64_size_kb:>6.1f}KB) | "
|
|
f"Time: {total_time:.3f}s | "
|
|
f"Compression: {compression_ratio:>5.1f}%")
|
|
|
|
# Recommend best settings
|
|
print(f"\n{'='*70}")
|
|
print("Recommendations:")
|
|
print(f"{'='*70}")
|
|
|
|
# Find best balance (around 85% quality, reasonable size)
|
|
balanced = [r for r in results if r['quality'] == 85 and r['max_size'] == 2048]
|
|
if balanced:
|
|
r = balanced[0]
|
|
print(f"\n✅ Recommended (Balanced):")
|
|
print(f" max_size=2048, quality=85")
|
|
print(f" Size: {r['compressed_size_kb']:.1f}KB | Time: {r['total_time']:.3f}s | Compression: {r['compression_ratio']:.1f}%")
|
|
|
|
# Find fastest
|
|
fastest = min(results, key=lambda x: x['total_time'])
|
|
print(f"\n⚡ Fastest:")
|
|
print(f" max_size={fastest['max_size']}, quality={fastest['quality']}")
|
|
print(f" Size: {fastest['compressed_size_kb']:.1f}KB | Time: {fastest['total_time']:.3f}s | Compression: {fastest['compression_ratio']:.1f}%")
|
|
|
|
# Find best compression
|
|
best_compression = max(results, key=lambda x: x['compression_ratio'])
|
|
print(f"\n📦 Best Compression:")
|
|
print(f" max_size={best_compression['max_size']}, quality={best_compression['quality']}")
|
|
print(f" Size: {best_compression['compressed_size_kb']:.1f}KB | Time: {best_compression['total_time']:.3f}s | Compression: {best_compression['compression_ratio']:.1f}%")
|
|
|
|
print()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Test with sample images
|
|
test_images = [
|
|
"./assets/girl.png",
|
|
"./assets/boy.jpg",
|
|
]
|
|
|
|
for img_path in test_images:
|
|
try:
|
|
test_compression(img_path)
|
|
except Exception as e:
|
|
print(f"Error testing {img_path}: {e}")
|
|
|
|
print(f"\n{'='*70}")
|
|
print("Test Complete!")
|
|
print(f"{'='*70}")
|
|
print("\nCurrent node settings: max_size=2048, quality=85")
|
|
print("This provides the best balance of quality, speed, and file size.")
|
|
|