Spaces:
Sleeping
Sleeping
File size: 2,583 Bytes
5800881 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
from PIL import Image
import numpy as np
import cv2 # Necesario si vas a trabajar con np arrays en BGR
def resize_image_for_print(image_np_bgr, target_dpi=300, target_long_side_cm=50):
"""
Redimensiona una imagen (numpy array BGR) para impresión a una resolución de 300 dpi
y un lado más largo de 50 cm, sin alterar la estética.
Args:
image_np_bgr (np.ndarray): Imagen de entrada en formato NumPy BGR.
target_dpi (int): Resolución deseada en DPI (píxeles por pulgada).
target_long_side_cm (float): Longitud deseada del lado más largo en centímetros.
Returns:
np.ndarray: La imagen redimensionada en formato NumPy BGR.
"""
if not isinstance(image_np_bgr, np.ndarray):
raise TypeError("La entrada debe ser un array de NumPy BGR.")
# Convertir de BGR a RGB para PIL si fuera necesario, pero PIL puede trabajar con arrays directamente
# Para simplicidad y consistencia, vamos a pasar de NumPy BGR a PIL RGB y luego de vuelta a NumPy BGR.
img_pil_rgb = Image.fromarray(cv2.cvtColor(image_np_bgr, cv2.COLOR_BGR2RGB))
# 1. Calcular el tamaño en píxeles basado en el lado más largo deseado y el DPI
# 1 pulgada = 2.54 cm
target_long_side_inches = target_long_side_cm / 2.54
target_long_side_pixels = int(target_long_side_inches * target_dpi)
# Obtener el ancho y alto actuales de la imagen PIL
width, height = img_pil_rgb.size
# Determinar cuál es el lado más largo de la imagen original
if width > height:
# El ancho es el lado más largo
new_width = target_long_side_pixels
new_height = int(height * (new_width / width))
else:
# El alto es el lado más largo (o son iguales)
new_height = target_long_side_pixels
new_width = int(width * (new_height / height))
# 2. Redimensionar la imagen usando un filtro de alta calidad
resized_img_pil_rgb = img_pil_rgb.resize((new_width, new_height), Image.LANCZOS)
# Convertir de nuevo a NumPy BGR
resized_np_rgb = np.array(resized_img_pil_rgb)
resized_np_bgr = cv2.cvtColor(resized_np_rgb, cv2.COLOR_RGB2BGR)
# Nota: Los metadatos de DPI no se pueden "incrustar" directamente en un np.ndarray.
# Si realmente necesitas guardarlo con DPI para impresión, la función de guardado
# debe hacerse fuera de aquí, quizás en el main.py cuando se exporta el resultado final.
# Por ahora, esta función solo devuelve la imagen redimensionada.
return resized_np_bgr |