Testeando.mp4
Para que el siguiente codigo funcione de forma 100% correcta, tenes que tener la carpeta de descargas limpia.
pip install selenium
pip install pyautogui
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.
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)
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.
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".
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
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
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)