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 decore/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:
- 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 decore/src/raw.rs. - Revelar el sensor.
core/src/decode.rsresta 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. - Leer los metadatos.
core/src/exif.rslee el EXIF ycore/src/profile.rsdeduce 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. - Buscar el objetivo.
core/src/lensdb.rslo 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:
- Corrección del objetivo: viñeteo, distorsión y aberración cromática
(
core/src/lensdb.rs). - Encuadre: detección de inclinación (
core/src/straighten.rs), giro y recorte (core/src/geometry.rs). - Quitar motas (
core/src/local.rs), antes de medir nada. - Balance de blancos, aplicado como adaptación cromática de Bradford.
- Exposición. Las mediciones en que se basan las correcciones automáticas
están en
core/src/analyze.rs. - Mapeo de tonos local, que comprime el rango de la escena y es también donde actúa la claridad.
- Filtros graduados y radiales (
core/src/local.rs). - Hombro fílmico, que lleva la luz de la escena a lo que cabe en una pantalla.
- En Oklab: punto negro y blanco, contraste, sombras/medios/luces, ruido de color y de luminancia, intensidad, recuperación de enfoque y nitidez.
- 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 decore/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.jsle 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
localStoragedel 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 buildy luegonpm run preview, y lo tendrás enlocalhost:8790.tools/build.shrecompila también el módulo WebAssembly si tienes Rust.
Mapa del repositorio
| Carpeta | Qué 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.