Skip to content

Instantly share code, notes, and snippets.

@hectorgool
Last active August 5, 2024 12:37
Show Gist options
  • Save hectorgool/0606b5d6058daee776b1941bad088ae4 to your computer and use it in GitHub Desktop.
Save hectorgool/0606b5d6058daee776b1941bad088ae4 to your computer and use it in GitHub Desktop.
import os
import sys
import shutil
from datetime import datetime
from PIL import Image

def get_timestamped_directory():
    # Obtiene la fecha y hora actual
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    # Crea un nombre de directorio basado en la fecha y hora
    return f"images_{timestamp}"

def resize_image(image_path, my_image_width, output_directory):
    # Abre la imagen
    img = Image.open(image_path)
    
    # Calcula la altura manteniendo la proporción
    aspect_ratio = img.height / img.width
    my_image_heigth = int(my_image_width * aspect_ratio)
    
    # Redimensiona la imagen
    resized_img = img.resize((my_image_width, my_image_heigth), Image.ANTIALIAS)
    
    # Crea el nuevo nombre del archivo
    base_name = os.path.splitext(os.path.basename(image_path))[0]
    new_image_name = f"{base_name}_{my_image_width}x{my_image_heigth}.png"
    new_image_path = os.path.join(output_directory, new_image_name)
    
    # Guarda la nueva imagen en el directorio de salida
    resized_img.save(new_image_path)
    print(f"Imagen guardada como: {new_image_path}")

def process_directory(directory_path, my_image_width, output_directory):
    # Recorre todos los archivos en el directorio
    for filename in os.listdir(directory_path):
        if filename.endswith(".png"):
            file_path = os.path.join(directory_path, filename)
            resize_image(file_path, my_image_width, output_directory)

def compress_directory(directory_path):
    zip_filename = f"{directory_path}.zip"
    shutil.make_archive(directory_path, 'zip', directory_path)
    print(f"Directorio comprimido en: {zip_filename}")

if __name__ == "__main__":
    # Verifica que se hayan pasado los argumentos correctos
    if len(sys.argv) < 3:
        print("Uso: python script.py <nombre_imagen_o_directorio> <ancho_en_pixeles> [-z]")
        sys.exit(1)
    
    path = sys.argv[1]
    my_image_width = int(sys.argv[2])
    compress = '-z' in sys.argv
    
    # Crea el directorio de salida con el timestamp
    output_directory = get_timestamped_directory()
    os.makedirs(output_directory, exist_ok=True)
    
    if os.path.isfile(path):
        # Si el primer argumento es un archivo, procesa solo esa imagen
        resize_image(path, my_image_width, output_directory)
    elif os.path.isdir(path):
        # Si el primer argumento es un directorio, procesa todas las imágenes PNG en el directorio
        process_directory(path, my_image_width, output_directory)
    else:
        print("El primer argumento debe ser un archivo PNG o un directorio.")
        sys.exit(1)
    
    # Si el argumento -z está presente, comprime el directorio de salida
    if compress:
        compress_directory(output_directory)

Explicación de la Actualización:

  1. Argumento -z:

    • El script ahora verifica si el argumento -z está presente en los argumentos de la línea de comandos.
    • Si está presente, el directorio de salida será comprimido en un archivo .zip utilizando la función compress_directory.
  2. Función compress_directory(directory_path):

    • Utiliza shutil.make_archive para comprimir el directorio de salida en un archivo .zip.
  3. Instrucciones de Uso:

    • Para redimensionar imágenes sin comprimir el directorio:
      python resize_images.py mi_imagen.png 800
    • Para redimensionar imágenes y comprimir el directorio de salida:
      python resize_images.py mi_imagen.png 800 -z

El directorio de salida será comprimido en un archivo .zip con el mismo nombre del directorio, pero con la extensión .zip, y se guardará en la misma ubicación.


Redacta un script en Python que cumpla con las siguientes especificaciones:

  1. Ejecución y argumentos:

    • El script debe ejecutarse desde la línea de comandos.
    • Debe recibir dos argumentos:
      • El primero es el nombre de un archivo de imagen en formato PNG (por ejemplo, mi_imagen.png).
      • El segundo es la longitud deseada de la imagen en píxeles, que se almacenará en una variable llamada my_image_width.
  2. Cálculo y proporciones:

    • El script debe calcular la altura proporcional de la imagen para mantener su relación de aspecto, basándose en el valor de my_image_width. La altura calculada se almacenará en una variable llamada my_image_height.
  3. Guardado del archivo modificado:

    • El archivo de imagen redimensionado debe guardarse con el mismo nombre, pero con un sufijo adicional en el formato _axb.png, donde:
      • a es el valor de my_image_width.
      • b es el valor de my_image_height.
  4. Manejo de archivos y directorios:

    • Si el primer argumento es un archivo, se aplica el proceso anterior a dicho archivo.
    • Si el primer argumento es un directorio, se deben redimensionar todas las imágenes PNG en ese directorio utilizando el proceso descrito.
  5. Directorio de salida:

    • Las imágenes redimensionadas deben guardarse en la misma ruta, dentro de un nuevo directorio llamado images_YYYYMMDD_HHMMSS, donde:
      • YYYY es el año en formato de cuatro dígitos (por ejemplo, 2024).
      • MM es el mes en formato de dos dígitos (por ejemplo, 08 para agosto).
      • DD es el día en formato de dos dígitos (por ejemplo, 04).
      • HH es la hora en formato de 24 horas (por ejemplo, 14).
      • MM son los minutos en formato de dos dígitos (por ejemplo, 30).
      • SS son los segundos en formato de dos dígitos (por ejemplo, 15).

import os
import sys
import shutil
from datetime import datetime
from PIL import Image
def get_timestamped_directory():
# Obtiene la fecha y hora actual
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
# Crea un nombre de directorio basado en la fecha y hora
return f"images_{timestamp}"
def resize_image(image_path, my_image_width, output_directory):
# Abre la imagen
img = Image.open(image_path)
# Calcula la altura manteniendo la proporción
aspect_ratio = img.height / img.width
my_image_heigth = int(my_image_width * aspect_ratio)
# Redimensiona la imagen
resized_img = img.resize((my_image_width, my_image_heigth), Image.ANTIALIAS)
# Crea el nuevo nombre del archivo
base_name = os.path.splitext(os.path.basename(image_path))[0]
new_image_name = f"{base_name}_{my_image_width}x{my_image_heigth}.png"
new_image_path = os.path.join(output_directory, new_image_name)
# Guarda la nueva imagen en el directorio de salida
resized_img.save(new_image_path)
print(f"Imagen guardada como: {new_image_path}")
def process_directory(directory_path, my_image_width, output_directory):
# Recorre todos los archivos en el directorio
for filename in os.listdir(directory_path):
if filename.endswith(".png"):
file_path = os.path.join(directory_path, filename)
resize_image(file_path, my_image_width, output_directory)
def compress_directory(directory_path):
zip_filename = f"{directory_path}.zip"
shutil.make_archive(directory_path, 'zip', directory_path)
print(f"Directorio comprimido en: {zip_filename}")
if __name__ == "__main__":
# Verifica que se hayan pasado los argumentos correctos
if len(sys.argv) < 3:
print(f"\nUso: python {sys.argv[0]} <nombre_imagen_o_directorio> <ancho_en_pixeles> [-z]")
sys.exit(1)
path = sys.argv[1]
my_image_width = int(sys.argv[2])
compress = '-z' in sys.argv
# Crea el directorio de salida con el timestamp
output_directory = get_timestamped_directory()
os.makedirs(output_directory, exist_ok=True)
if os.path.isfile(path):
# Si el primer argumento es un archivo, procesa solo esa imagen
resize_image(path, my_image_width, output_directory)
elif os.path.isdir(path):
# Si el primer argumento es un directorio, procesa todas las imágenes PNG en el directorio
process_directory(path, my_image_width, output_directory)
else:
print("El primer argumento debe ser un archivo PNG o un directorio.")
sys.exit(1)
# Si el argumento -z está presente, comprime el directorio de salida
if compress:
compress_directory(output_directory)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment