59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
from PIL import Image
|
|
import numpy as np
|
|
from typing import Tuple
|
|
from .conversion import DEVICE_SPECS, ModelId, DeviceSpec
|
|
|
|
|
|
def optimize(img: Image.Image, model: ModelId) -> Image.Image:
|
|
"""
|
|
Optimize an image for a specific Gicisky device model.
|
|
|
|
Args:
|
|
img: Input PIL Image
|
|
model: Device model identifier
|
|
|
|
Returns:
|
|
Image.Image: Optimized image
|
|
"""
|
|
specs: DeviceSpec = DEVICE_SPECS.get(model)
|
|
if not specs:
|
|
raise ValueError(f"Unknown model: {model}")
|
|
target_width, target_height = specs.size
|
|
|
|
canvas = Image.new("RGB", (target_width, target_height), color="white")
|
|
img_width, img_height = img.size
|
|
scale = min(target_width / img_width, target_height / img_height)
|
|
new_width = int(img_width * scale)
|
|
new_height = int(img_height * scale)
|
|
|
|
resized_img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
|
|
x_offset = (target_width - new_width) // 2
|
|
y_offset = (target_height - new_height) // 2
|
|
|
|
canvas.paste(resized_img, (x_offset, y_offset))
|
|
|
|
palette = Image.new("P", (1, 1))
|
|
colors = 3
|
|
|
|
# Apply appropriate color conversion
|
|
if specs.second_color:
|
|
palette.putpalette([
|
|
0, 0, 0, # Black
|
|
255, 255, 255, # White
|
|
255, 0, 0 # Red
|
|
])
|
|
else:
|
|
palette.putpalette([
|
|
0, 0, 0, # Black
|
|
255, 255, 255, # White
|
|
])
|
|
colors = 2
|
|
|
|
processed_img = canvas.quantize(method=Image.MEDIANCUT,
|
|
colors=colors,
|
|
kmeans=0,
|
|
palette=palette)
|
|
processed_img = processed_img.convert("RGB")
|
|
|
|
return processed_img
|
|
|