LumiRaw del raw a la fotografía terminada v1.12.0

Cómo funciona, y dónde está el código

Todo el código de LumiRaw es público en github.com/margual56/lumiraw, con licencia AGPL-3.0. Esta página sigue a una foto desde que la abres hasta que la descargas, y dice dónde está cada parte para que puedas leerla en vez de fiarte de mí.

En resumen

LumiRaw es un sitio estático: HTML, JavaScript, CSS, un módulo WebAssembly y unos archivos de datos. No hay servidor propio, ni base de datos, ni cuentas. El servidor solo entrega esos archivos, igual a todo el mundo. Todo lo que se hace con una foto ocurre en tu navegador.

Qué descarga tu navegador

  • La página, hecha con SvelteKit y compilada a archivos estáticos (web/).
  • El motor de revelado, web/src/lib/wasm/darkroom.wasm: unos 6 MB, 1,7 MB comprimido. Es el código Rust de core/ compilado a WebAssembly.
  • La lista de cámaras de lensfun, y luego solo los objetivos de la montura de tu cámara (web/src/lib/wasm/lenses/).

No hay scripts de terceros, ni fuentes externas, ni estadísticas. El web/package.json solo tiene herramientas de compilación: en la página no se ejecuta ninguna librería ajena.

Al abrir un archivo

El navegador lee el archivo en memoria (web/src/lib/api.js) y se lo pasa a un Web Worker (web/src/lib/wasm/worker.js), que lo copia a la memoria del módulo WebAssembly. Desde ahí, todo es Rust:

  1. Decodificar. El formato de cada cámara lo lee rawler, el decodificador de dnglab, incluido en core/vendor/rawler/. El resto del código solo habla con él a través de core/src/raw.rs.
  2. Revelar el sensor. core/src/decode.rs resta el nivel de negro, aplica el balance de blancos de la cámara, interpola el mosaico de color (Malvar, He y Cutler para el patrón Bayer habitual; diferencia de color para X-Trans y otros), reconstruye las luces quemadas y pasa los colores de la cámara a sRGB lineal.
  3. Leer los metadatos. core/src/exif.rs lee el EXIF y core/src/profile.rs deduce de él lo que importa para revelar: cuánto ruido cabe esperar a ese ISO, cuánto ablanda la difracción a ese diafragma, si hay riesgo de trepidación.
  4. Buscar el objetivo. core/src/lensdb.rs lo busca en la base de datos de lensfun.

El revelado

Cada vista previa y cada exportación pasan por estos pasos, en este orden. La mayoría está en core/src/grade.rs, y core/src/develop.rs los une:

  1. Corrección del objetivo: viñeteo, distorsión y aberración cromática (core/src/lensdb.rs).
  2. Encuadre: detección de inclinación (core/src/straighten.rs), giro y recorte (core/src/geometry.rs).
  3. Quitar motas (core/src/local.rs), antes de medir nada.
  4. Balance de blancos, aplicado como adaptación cromática de Bradford.
  5. Exposición. Las mediciones en que se basan las correcciones automáticas están en core/src/analyze.rs.
  6. Mapeo de tonos local, que comprime el rango de la escena y es también donde actúa la claridad.
  7. Filtros graduados y radiales (core/src/local.rs).
  8. Hombro fílmico, que lleva la luz de la escena a lo que cabe en una pantalla.
  9. En Oklab: punto negro y blanco, contraste, sombras/medios/luces, ruido de color y de luminancia, intensidad, recuperación de enfoque y nitidez.
  10. Color: mezclador (core/src/mixer.rs), blanco y negro y efectos (core/src/effects.rs), las ruedas de color (core/src/wheels.rs), tus curvas (core/src/curve.rs), tu .cube (core/src/lut.rs), viñeteo y grano. Un estilo es solo un ajuste de esos controles (web/src/lib/looks.json, a partir de core/src/looks.rs).

Cada paso automático anota lo que decidió en un informe (core/kit/src/report.rs). Eso es lo que la interfaz enseña junto a cada control y en la lista de correcciones del paso Antes y después.

Las vistas previas se revelan a tamaño reducido. La vista al 100 % revela solo el trozo que ves, con las decisiones tomadas sobre la foto entera, para que coincida con la exportación.

Al exportar

  • PNG, JPEG y TIFF se codifican en Rust (core/src/output.rs), con los metadatos de la cámara copiados (core/src/exif.rs).
  • WebP lo codifica el propio navegador desde un canvas, y web/src/lib/wasm/webp.js le añade el EXIF.
  • El zip de varias fotos lo escribe web/src/lib/zip.js, unas cien líneas sin librerías.
  • La descarga es un enlace a un blob creado en la propia página: el archivo va de la memoria de la pestaña a tu disco.

Fusionar exposiciones

core/src/merge.rs agrupa las fotos en horquillados según los ajustes de la cámara y el tiempo entre disparos, comprueba la exposición de cada una con sus propios píxeles, las alinea (con mapas de bits por umbral de mediana), las combina dando a cada zona el peso de la exposición que mejor la recoge y quita los objetos que se movieron. La API está en core/darkroom/src/bracket.rs.

Elegir fotos

core/critic/src/net.rs es MobileNet escrita a mano, sin librerías, y se compila a un módulo wasm aparte que solo carga la página de selección. Las dos redes NIMA de idealo (una estética, otra técnica) se convierten con tools/bake-nima.mjs y se descargan la primera vez que se usan. web/src/lib/critic.js reparte las fotos entre varios workers y web/src/lib/cull.js agrupa las ráfagas y elige.

Redes en el revelador

El revelador ejecuta tres redes pequeñas mediante core/critic/src/graph.rs, cada una descargada la primera vez que hace falta: el detector de caras de MediaPipe, para leer los tonos de piel (core/src/skin.rs); DeepLab v3 de MediaPipe, para los filtros de «Sujeto» (core/src/masks.rs, que también encuentra el cielo sin red); y PMRID de Megvii, que limpia el mosaico raw antes que nada cuando la reducción de ruido profunda está activada (core/src/denoise.rs, preparada por tools/bake-denoiser.mjs).

Qué se guarda

  • En el localStorage del navegador: los ajustes de cada archivo, identificado por nombre, tamaño y fecha de modificación, hasta 300 archivos (web/src/lib/memory.js); el idioma; si quieres enderezar automáticamente; y lo que escribes en las calculadoras, con tus sitios guardados.
  • En la caché del service worker (web/src/service-worker.js): los archivos de la propia aplicación, para que funcione sin conexión, y hasta 500 archivos de previsión, relieve y atlas de las calculadoras, para no volver a pedirlos. La aplicación de escritorio guarda esos archivos en su carpeta de caché (desktop/src-tauri/src/cache.rs).
  • Ni un píxel de tus fotos, en ningún sitio.

Comprobarlo tú

  • Sin conexión. Carga la página, activa el modo avión y abre un RAW. Funciona igual.
  • Pestaña de red. En las herramientas de desarrollo, revela y exporta una foto: no aparece ninguna petición con su contenido.
  • Política de seguridad. El sitio manda una cabecera Content-Security-Policy (web/static/_headers) que prohíbe a la página conectarse a cualquier dirección que no sea la suya, salvo a Terrain Tiles (en AWS) por las alturas del terreno, al atlas de contaminación lumínica de David Lorenz y a Open-Meteo por la previsión de nubes, para las calculadoras de la hora dorada y del cielo oscuro. La hace cumplir tu navegador, no yo, y puedes verla en las cabeceras de la respuesta. También dice quién puede mostrar la aplicación dentro de sus páginas: solo el blog, para que sus guías dejen probar cada paso con una foto de ejemplo, que les da el propio blog.
  • Ejecutarlo tú. Si no quieres fiarte de mi servidor, no hace falta: clona el repositorio, ejecuta npm run build y luego npm run preview, y lo tendrás en localhost:8790. tools/build.sh recompila también el módulo WebAssembly si tienes Rust.

Mapa del repositorio

CarpetaQué hay
core/src/El proceso de revelado, en Rust.
core/kit/Imágenes, color, matrices, filtros y matemáticas.
core/darkroom/La API sobre el proceso, y el módulo WebAssembly que se compila de ella.
core/vendor/rawler/El decodificador de RAW, incluido con un cambio en su manifiesto.
web/src/La página: pasos, componentes, traducciones y el worker.
web/static/Iconos, cabeceras, redirecciones y las fotos de ejemplo.
tools/Compilación, la base de datos de objetivos, los estilos y pruebas.
.github/workflows/Las pruebas que se ejecutan con cada cambio.

Licencia

LumiRaw es AGPL-3.0 (LICENSE): puedes leerlo, modificarlo y publicarlo, y si ofreces una versión modificada a otros tienes que compartir su código. rawler es LGPL-2.1, la base de datos de lensfun CC BY-SA 3.0, los estilos CC BY-SA 4.0, los catálogos del cielo de d3-celestial BSD-3-Clause y la previsión de Open-Meteo CC BY 4.0; más detalles en Acerca de.

Abrir un RAW