From 96656bccb745f180c8699fb8f952027b77c8d5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Maldonado?= Date: Mon, 20 Jul 2026 14:52:07 +0200 Subject: [PATCH] Corrige varias cosas --- README.md | 387 ++++++++++++++++++++++++++++++++++++++++++++++++- heic_to_jpg.py | 2 +- nef_to_jpg.py | 2 +- 3 files changed, 388 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9549ea6..2b336e2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,388 @@ # Logo-Imagenes -Incluye el logo en todas las imágenes \ No newline at end of file +Herramientas en Python para convertir imágenes a formato JPEG y añadir automáticamente un logotipo sobre las imágenes procesadas. + +El proyecto permite: + +* Convertir archivos Sony RAW `.ARW` a `.JPG`. +* Convertir archivos `.HEIC` a `.JPG`. +* Añadir un logotipo PNG sobre imágenes JPEG o PNG. +* Mantener la estructura de subdirectorios entre las carpetas de entrada y salida. +* Generar nombres únicos basados en la fecha de modificación del archivo original. + +## Estructura del proyecto + +```text +Logo-Imagenes/ +├── arw_to_jpg.py +├── heic_to_jpg.py +├── nef_to_jpg.py +├── main.py +├── logo.png +├── conlogo/ +├── withoutlogo/ +└── README.md +``` + +### Directorios + +| Ruta | Descripción | +| -------------- | --------------------------------------------------------- | +| `withoutlogo/` | Imágenes de entrada sobre las que se añadirá el logotipo. | +| `conlogo/` | Imágenes generadas con el logotipo. | +| `arw/` | Archivos `.ARW` que se convertirán a JPEG. | +| `heic2/` | Archivos `.HEIC` que se convertirán a JPEG. | +| `logo.png` | Logotipo utilizado por defecto. | + +Los directorios de entrada pueden contener subdirectorios. El script `main.py` reproduce esa estructura dentro de `conlogo/`. + +## Requisitos + +* Python 3.10 o superior. +* Pillow. +* rawpy. +* OpenCV. +* `libheif-examples`, que proporciona el comando `heif-convert`. + +### Instalación en Debian o Ubuntu + +```bash +sudo apt update +sudo apt install python3 python3-venv libheif-examples +``` + +Crea y activa un entorno virtual: + +```bash +python3 -m venv .venv +source .venv/bin/activate +``` + +Instala las dependencias de Python: + +```bash +pip install Pillow rawpy opencv-python +``` + +Opcionalmente, crea un archivo `requirements.txt`: + +```text +Pillow +rawpy +opencv-python +``` + +E instala las dependencias mediante: + +```bash +pip install -r requirements.txt +``` + +## Uso + +Todos los comandos deben ejecutarse desde el directorio raíz del repositorio. + +```bash +cd Logo-Imagenes +``` + +## Añadir el logotipo a imágenes + +El script `main.py` procesa recursivamente las imágenes situadas en `withoutlogo/`. + +Formatos admitidos: + +* `.jpg` +* `.jpeg` +* `.png` + +### Preparación + +Copia las imágenes de entrada: + +```bash +cp /ruta/a/las/imagenes/* withoutlogo/ +``` + +También puedes utilizar subdirectorios: + +```text +withoutlogo/ +├── evento-1/ +│ ├── foto-01.jpg +│ └── foto-02.jpg +└── evento-2/ + └── foto-03.png +``` + +Coloca el logotipo en: + +```text +logo.png +``` + +El logotipo debe ser una imagen PNG con transparencia. + +### Ejecución + +```bash +python main.py +``` + +Las imágenes procesadas se guardarán en `conlogo/`: + +```text +conlogo/ +├── evento-1/ +│ ├── 20260720_154500.jpg +│ └── 20260720_154535.jpg +└── evento-2/ + └── 20260720_160010.png +``` + +### Comportamiento del logotipo + +El script: + +1. Lee la orientación EXIF de la imagen. +2. Corrige la rotación cuando es necesario. +3. Redimensiona el logotipo para que no supere el 35 % del lado menor de la imagen. +4. Añade un margen equivalente al 3,5 % del lado menor. +5. Sitúa el logotipo en la esquina inferior izquierda. +6. Guarda el resultado dentro de `conlogo/`. + +Cuando ya existe un archivo con el mismo nombre, añade un sufijo numérico: + +```text +20260720_154500.jpg +20260720_154500_1.jpg +20260720_154500_2.jpg +``` + +## Convertir ARW a JPG + +El script `arw_to_jpg.py` busca archivos `.ARW` dentro del directorio `arw/` y sus subdirectorios. + +### Preparación + +```bash +mkdir -p arw +cp /ruta/a/las/fotos/*.ARW arw/ +``` + +### Ejecución + +```bash +python arw_to_jpg.py +``` + +Cada archivo convertido se guarda junto al archivo original: + +```text +arw/ +├── DSC00001.ARW +├── DSC00001.jpg +├── DSC00002.ARW +└── DSC00002.jpg +``` + +Los JPEG se generan con calidad `100`. + +Después de convertirlos, puedes moverlos a `withoutlogo/` para aplicar el logotipo: + +```bash +find arw -type f -iname '*.jpg' -exec cp --parents {} withoutlogo/ \; +``` + +## Convertir HEIC a JPG + +El script `heic_to_jpg.py` busca imágenes HEIC dentro de `heic2/`. + +### Preparación + +```bash +mkdir -p heic2 +cp /ruta/a/las/fotos/*.HEIC heic2/ +``` + +### Ejecución + +```bash +python heic_to_jpg.py +``` + +La conversión utiliza: + +```bash +heif-convert -q 100 entrada.HEIC salida.jpg +``` + +Los archivos JPEG se guardan en el mismo directorio que los originales. + +## Conversión de NEF + +El archivo `nef_to_jpg.py` no convierte actualmente archivos Nikon `.NEF`. + +Su contenido es una copia del conversor HEIC: + +* Busca archivos `.HEIC`. +* Utiliza `heif-convert`. +* Trabaja sobre el directorio `heic2/`. + +Por tanto, no debe considerarse funcional como conversor NEF. + +Para convertir archivos `.NEF`, puede utilizarse `rawpy`, con una implementación equivalente a la utilizada para ARW. + +Ejemplo: + +```python +import os + +import cv2 +import rawpy + +directory = "nef" + +for root, _, files in os.walk(directory): + for filename in files: + if not filename.lower().endswith(".nef"): + continue + + input_path = os.path.join(root, filename) + output_path = os.path.splitext(input_path)[0] + ".jpg" + + print(f"Convirtiendo {input_path} → {output_path}") + + with rawpy.imread(input_path) as raw: + rgb = raw.postprocess() + + bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR) + + success = cv2.imwrite( + output_path, + bgr, + [int(cv2.IMWRITE_JPEG_QUALITY), 100], + ) + + if not success: + raise RuntimeError(f"No se pudo guardar {output_path}") +``` + +## Configuración + +El logotipo utilizado por `main.py` se define mediante: + +```python +logo_hor = "./logo.png" +logo_file = logo_hor +``` + +También existe una ruta absoluta alternativa: + +```python +logo_ver = "/home/jesusjmma/Documents/Logos/CEEBI/CEEBI/Logo CEEBI vertical blanco.png" +``` + +Esa ruta depende del equipo del autor y no es portable. Se recomienda utilizar únicamente rutas relativas al repositorio. + +## Flujo de trabajo recomendado + +### Fotografías ARW + +```bash +python arw_to_jpg.py +find arw -type f -iname '*.jpg' -exec cp --parents {} withoutlogo/ \; +python main.py +``` + +### Fotografías HEIC + +```bash +python heic_to_jpg.py +find heic2 -type f -iname '*.jpg' -exec cp --parents {} withoutlogo/ \; +python main.py +``` + +### Fotografías JPG o PNG + +```bash +cp /ruta/a/las/imagenes/* withoutlogo/ +python main.py +``` + +## Limitaciones actuales + +* Los nombres de los directorios están definidos directamente en el código. +* `heic_to_jpg.py` contiene rutas absolutas específicas del equipo del autor. +* `nef_to_jpg.py` no implementa conversión NEF. +* No existe una interfaz de línea de comandos. +* No se validan todos los posibles modos de color de las imágenes. +* Los metadatos EXIF pueden perderse al guardar la imagen procesada. +* El logotipo se carga una sola vez y se redimensiona durante el procesamiento. +* No existe una gestión centralizada de errores ni un sistema de registros. +* Los scripts ejecutan su lógica directamente al importarse. +* Las imágenes procesadas pueden ocupar bastante espacio al guardarse con calidad máxima. + +## Mejoras recomendadas + +* Sustituir las rutas absolutas por rutas relativas. +* Añadir argumentos de línea de comandos con `argparse`. +* Unificar los conversores ARW y NEF. +* Permitir seleccionar las carpetas de entrada y salida. +* Permitir configurar posición, tamaño y margen del logotipo. +* Añadir un archivo `requirements.txt`. +* Añadir pruebas automatizadas. +* Preservar los metadatos EXIF. +* Separar el código en funciones reutilizables. +* Añadir un archivo `.gitignore`. +* Evitar versionar fotografías originales y resultados generados. + +## `.gitignore` recomendado + +```gitignore +# Python +__pycache__/ +*.py[cod] +.venv/ +venv/ + +# Editores +.vscode/ +.idea/ + +# Entradas y resultados +arw/* +heic2/* +nef/* +withoutlogo/* +conlogo/* + +# Mantener los directorios +!arw/.gitkeep +!heic2/.gitkeep +!nef/.gitkeep +!withoutlogo/.gitkeep +!conlogo/.gitkeep + +# Fotografías RAW +*.arw +*.ARW +*.nef +*.NEF +*.heic +*.HEIC +``` + +Para conservar los directorios vacíos en Git: + +```bash +touch arw/.gitkeep +touch heic2/.gitkeep +touch nef/.gitkeep +touch withoutlogo/.gitkeep +touch conlogo/.gitkeep +``` + +## Licencia + +Copyright © 2026 Jesús Maldonado. Todos los derechos reservados. diff --git a/heic_to_jpg.py b/heic_to_jpg.py index 2d47b5d..ab5e264 100644 --- a/heic_to_jpg.py +++ b/heic_to_jpg.py @@ -6,7 +6,7 @@ for folder,subfolder,files in os.walk(directory): for filename in files: if filename.lower().endswith(".heic") or filename.lower().endswith(".HEIC"): print('Converting %s' % os.path.join(folder, filename)) - bashCommand = "heif-convert -q 100 \'/home/jesusjmma/proj/LogoImagenes/"+folder+"/"+filename+"\' \'/home/jesusjmma/proj/LogoImagenes/"+folder+"/"+filename.replace('.HEIC', '.jpg')+"\'" + bashCommand = "heif-convert -q 100 \'./"+folder+"/"+filename+"\' \'./"+folder+"/"+filename.replace('.HEIC', '.jpg')+"\'" print(bashCommand) result = subprocess.run([bashCommand], shell=True) continue \ No newline at end of file diff --git a/nef_to_jpg.py b/nef_to_jpg.py index 2d47b5d..ab5e264 100644 --- a/nef_to_jpg.py +++ b/nef_to_jpg.py @@ -6,7 +6,7 @@ for folder,subfolder,files in os.walk(directory): for filename in files: if filename.lower().endswith(".heic") or filename.lower().endswith(".HEIC"): print('Converting %s' % os.path.join(folder, filename)) - bashCommand = "heif-convert -q 100 \'/home/jesusjmma/proj/LogoImagenes/"+folder+"/"+filename+"\' \'/home/jesusjmma/proj/LogoImagenes/"+folder+"/"+filename.replace('.HEIC', '.jpg')+"\'" + bashCommand = "heif-convert -q 100 \'./"+folder+"/"+filename+"\' \'./"+folder+"/"+filename.replace('.HEIC', '.jpg')+"\'" print(bashCommand) result = subprocess.run([bashCommand], shell=True) continue \ No newline at end of file