Skip to content

馃摲 Automatizacion de operaciones que hago para las imagenes individualmente, recortar las imagenes y aumentar las resoluciones de forma automatica

License

Notifications You must be signed in to change notification settings

Fabian-Martinez-Rincon/MidFlash

Repository files navigation

馃 MidFlash


Testeando.mp4

Version de Selenium 4.7.2

Para que el siguiente codigo funcione de forma 100% correcta, tenes que tener la carpeta de descargas limpia.

Instalar dependencias

pip install selenium
pip install pyautogui

Explicacion momentanea

  • 1) El programa comienza leyendo la ruta de una imagen de entrada y carg谩ndola en memoria.
  • 2) El programa utiliza una t茅cnica de procesamiento de imagen, como el algoritmo de borde de Canny, para detectar los bordes de la imagen y determinar qu茅 partes de la imagen deben recortarse.
  • 3) El programa recorta la imagen seg煤n los bordes detectados y almacena la imagen recortada en una variable.
  • 4) El programa utiliza un modelo de inteligencia artificial entrenado para aumentar la resoluci贸n de las im谩genes para aumentar la resoluci贸n de la imagen recortada.
  • 5) El programa guarda la imagen con la resoluci贸n aumentada en una ruta de salida especificada por el usuario.
  • 6) El programa finaliza y muestra al usuario un mensaje de 茅xito o un mensaje de error en caso de que haya ocurrido alg煤n problema durante el procesamiento.

Links de ayuda

Config

import os
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import pyautogui
import time
from selenium.webdriver.support.wait import WebDriverWait


PATH_BASE = os.getcwd()
PATH_SOURCE = os.path.join(PATH_BASE, "base_images")
PATH_PROSSED = os.path.join(PATH_BASE, "processed_images")
PATH_PROSSED_RESOLUTION = os.path.join(PATH_BASE, "processed_resolution_images")
PATH_DOWNLOAD = "C:\\Users\\fabian\\Downloads"

BUTTON_CLOSE = 'button-close.modal__close-button'
BUTTON_COOKIES = 'button.medium-up.button--small.button--small-mobile.button--black'
BUTTON_LOAD = 'button.hero__button.button--small.button--small-mobile.button--white'
BUTTON_DOWNLOAD = 'button.button--medium.button--medium-mobile.button--black'
BUTTON_NEWLOAD = 'button.button--outline.button--medium.button--medium-mobile.button--black'

DRIVER = webdriver.Chrome(executable_path="chromedriver", chrome_options=webdriver.ChromeOptions())
DRIVER.get("https://zyro.com/es/herramientas/upscaler-de-imagenes")

if not os.path.exists(PATH_PROSSED):
    os.makedirs(PATH_PROSSED, exist_ok=True)
    
if not os.path.exists(PATH_PROSSED_RESOLUTION):
    os.makedirs(PATH_PROSSED_RESOLUTION, exist_ok=True)

Download Wait

def download_wait(path_to_downloads):
    seconds = 0
    dl_wait = True
    while dl_wait and seconds < 20:
        time.sleep(1)
        dl_wait = False
        for fname in os.listdir(path_to_downloads):
            if fname.endswith('.crdownload'):
                dl_wait = True
        seconds += 1
    return seconds

Este c贸digo define una funci贸n llamada "download_wait" que toma un argumento llamado "path_to_downloads". La funci贸n espera a que un archivo de descarga se complete durante 20 segundos y luego devuelve el n煤mero de segundos que ha transcurrido desde el inicio de la descarga.

La funci贸n utiliza un bucle "while" para esperar a que la descarga se complete. El bucle "while" se ejecuta mientras la variable "dl_wait" sea verdadera y el n煤mero de segundos sea menor que 20. La variable "dl_wait" se establece en verdadero al principio de la funci贸n y se utiliza para controlar cu谩ndo debe finalizar el bucle.

Dentro del bucle "while", la funci贸n utiliza la funci贸n "sleep" de la biblioteca "time" para detener la ejecuci贸n del c贸digo durante un segundo. Luego, se establece la variable "dl_wait" en falso y se recorren todos los archivos en la carpeta de descargas especificada por el argumento "path_to_downloads". Si se encuentra un archivo que tenga como extensi贸n ".crdownload", se establece la variable "dl_wait" en verdadero de nuevo.

Finalmente, se incrementa el contador de segundos en uno y se vuelve a evaluar la condici贸n del bucle "while". Si la descarga a煤n no ha finalizado y el n煤mero de segundos es menor que 20, el bucle se repetir谩 y se volver谩 a ejecutar la funci贸n "sleep". Si la descarga se ha completado o si el n煤mero de segundos es igual o mayor que 20, el bucle se detendr谩 y la funci贸n devolver谩 el n煤mero de segundos que ha transcurrido desde el inicio de la descarga.

En resumen, esta funci贸n espera a que un archivo de descarga se complete durante 20 segundos y luego devuelve el n煤mero de segundos que ha transcurrido desde el inicio de la descarga.

Push Button

def push_button(button):
    WebDriverWait(DRIVER, 20).until(
        EC.element_to_be_clickable(
            DRIVER.find_element(By.CLASS_NAME, button)
        )).click()

Este c贸digo define una funci贸n llamada "push_button" que toma un argumento llamado "button". La funci贸n espera a que un elemento en la p谩gina web sea clickeable durante 20 segundos y, una vez que se haya vuelto clickeable, hace clic en 茅l.

La funci贸n utiliza la biblioteca de selenium "WebDriverWait" para esperar a que el elemento sea clickeable. La biblioteca "WebDriverWait" toma dos argumentos: el "WebDriver" y el tiempo de espera en segundos. El "WebDriver" es un objeto que representa el navegador web y se encarga de controlar el navegador y realizar acciones en la p谩gina web. El tiempo de espera especifica cu谩nto tiempo se debe esperar a que el elemento sea clickeable antes de que se produzca un error.

La funci贸n tambi茅n utiliza la biblioteca "EC" (Expected Conditions) de selenium para especificar la condici贸n esperada (en este caso, que el elemento sea clickeable). La biblioteca "EC" proporciona una serie de condiciones esperadas que se pueden usar para esperar a que se cumplan ciertas condiciones en la p谩gina web.

Por 煤ltimo, la funci贸n utiliza el m茅todo "find_element" del "WebDriver" para encontrar el elemento en la p谩gina web. El m茅todo "find_element" toma dos argumentos: el tipo de elemento que se est谩 buscando (en este caso, el nombre de la clase) y el valor del elemento (en este caso, el valor del argumento "button"). Una vez que se ha encontrado el elemento, se hace clic en 茅l usando el m茅todo "click".

Cutout

def cutout(image):
    imagen = Image.open(os.path.join(PATH_SOURCE, image))
    ancho, alto = imagen.size
    ancho_cuadrante = ancho // 2
    alto_cuadrante = alto // 2

    # Crea una lista con las coordenadas de cada cuadrante
    cuadrantes = [
        (0, 0, ancho_cuadrante, alto_cuadrante),
        (ancho_cuadrante, 0, ancho, alto_cuadrante),
        (0, alto_cuadrante, ancho_cuadrante, alto),
        (ancho_cuadrante, alto_cuadrante, ancho, alto)
    ]

    for i, cuadrante in enumerate(cuadrantes):
        # Utiliza el m茅todo crop() para cortar la imagen en el cuadrante especificado
        imagen_cuadrante = imagen.crop(cuadrante)
        
        imagen_cuadrante.save(
            os.path.join(
                PATH_PROSSED, 
                image.replace('.png', '_{}.jpg'.format(i))
                )
            )

Recorta la imagen en 4 cuadrantes


first_image y proced_image

def first_image(image):
    push_button(BUTTON_COOKIES)
    push_button(BUTTON_LOAD)
    
    time.sleep(3)
    pyautogui.write(image)
    pyautogui.press("enter")
    WebDriverWait(DRIVER, 10).until(EC.presence_of_element_located((By.CLASS_NAME, BUTTON_DOWNLOAD)))
    
    push_button(BUTTON_DOWNLOAD)

def proced_image(image):
    push_button(BUTTON_NEWLOAD)
    time.sleep(3)
    
    pyautogui.write(image)
    pyautogui.press("enter")
    
    time.sleep(15)
    push_button(BUTTON_DOWNLOAD)

Como la pagina tiene distintos botones dependiendo de la acci贸n, al principio era distinto automatizar las resoluciones, pero despues de la primera imagen, todas las demas eran con la misma operaci贸n, es por eso que hice dos modulos separados

El programa principal

try:
    imagenes = [
        imagen for imagen in os.listdir(PATH_SOURCE) 
        if imagen.endswith(('.jpg', '.png'))
    ]
    for image in imagenes:
        cutout(image)
        
    imagenes_procesadas = [
        os.path.join(PATH_PROSSED, imagen) for imagen in os.listdir(PATH_PROSSED) 
        if imagen.endswith(('.jpg', '.png'))
    ]
    
    first_image(imagenes_procesadas[0])    
    for image in imagenes_procesadas[1:]:
        proced_image(image)
    download_wait(PATH_DOWNLOAD)
    DRIVER.quit()
    
except FileNotFoundError:
    print('No existe la ruta', PATH_SOURCE)
except NotADirectoryError:
    print('La ruta no es un directorio ', PATH_SOURCE)

About

馃摲 Automatizacion de operaciones que hago para las imagenes individualmente, recortar las imagenes y aumentar las resoluciones de forma automatica

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages