2026-07-20 14:52:07 +02:00
2026-07-20 14:29:52 +02:00
2026-07-20 14:42:39 +02:00
2026-07-20 14:52:07 +02:00
2026-07-20 14:42:39 +02:00
2026-07-20 14:42:39 +02:00
2026-07-20 14:52:07 +02:00
2026-07-20 14:52:07 +02:00

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 .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

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

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:

  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:

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.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

# 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.

S
Description
Incluye el logo en todas las imágenes
Readme
137 KiB
Languages
Python 100%