Initial commit
This commit is contained in:
		
						commit
						735e5de328
					
				
					 25 changed files with 894 additions and 0 deletions
				
			
		
							
								
								
									
										59
									
								
								image/optimizer.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								image/optimizer.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,59 @@
 | 
			
		|||
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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue