8.2 KiB
Logo-Imagenes
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
.ARWa.JPG. - Convertir archivos
.HEICa.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
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 comandoheif-convert.
Instalación en Debian o Ubuntu
sudo apt update
sudo apt install python3 python3-venv libheif-examples
Crea y activa un entorno virtual:
python3 -m venv .venv
source .venv/bin/activate
Instala las dependencias de Python:
pip install Pillow rawpy opencv-python
Opcionalmente, crea un archivo requirements.txt:
Pillow
rawpy
opencv-python
E instala las dependencias mediante:
pip install -r requirements.txt
Uso
Todos los comandos deben ejecutarse desde el directorio raíz del repositorio.
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:
cp /ruta/a/las/imagenes/* withoutlogo/
También puedes utilizar subdirectorios:
withoutlogo/
├── evento-1/
│ ├── foto-01.jpg
│ └── foto-02.jpg
└── evento-2/
└── foto-03.png
Coloca el logotipo en:
logo.png
El logotipo debe ser una imagen PNG con transparencia.
Ejecución
python main.py
Las imágenes procesadas se guardarán en conlogo/:
conlogo/
├── evento-1/
│ ├── 20260720_154500.jpg
│ └── 20260720_154535.jpg
└── evento-2/
└── 20260720_160010.png
Comportamiento del logotipo
El script:
- Lee la orientación EXIF de la imagen.
- Corrige la rotación cuando es necesario.
- Redimensiona el logotipo para que no supere el 35 % del lado menor de la imagen.
- Añade un margen equivalente al 3,5 % del lado menor.
- Sitúa el logotipo en la esquina inferior izquierda.
- Guarda el resultado dentro de
conlogo/.
Cuando ya existe un archivo con el mismo nombre, añade un sufijo numérico:
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
mkdir -p arw
cp /ruta/a/las/fotos/*.ARW arw/
Ejecución
python arw_to_jpg.py
Cada archivo convertido se guarda junto al archivo original:
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:
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
mkdir -p heic2
cp /ruta/a/las/fotos/*.HEIC heic2/
Ejecución
python heic_to_jpg.py
La conversión utiliza:
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:
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:
logo_hor = "./logo.png"
logo_file = logo_hor
También existe una ruta absoluta alternativa:
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
python arw_to_jpg.py
find arw -type f -iname '*.jpg' -exec cp --parents {} withoutlogo/ \;
python main.py
Fotografías HEIC
python heic_to_jpg.py
find heic2 -type f -iname '*.jpg' -exec cp --parents {} withoutlogo/ \;
python main.py
Fotografías JPG o PNG
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.pycontiene rutas absolutas específicas del equipo del autor.nef_to_jpg.pyno 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
# 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:
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.