← Proyectos
WebEscritorio

ABR Image Viewer

Visor de imágenes privado para Windows, Linux y el navegador, hecho a mi gusto. Su función principal es el mosaico configurable, con varias imágenes a la vez y cada una con su zoom, su desplazamiento y su giro, diseños propios con celdas que se mueven y redimensionan, y autoreproducción por página o por celda. Además, galería con búsqueda, favoritos, metadatos EXIF, atajos reasignables y modo incógnito. La app de escritorio usa Tauri y su instalador ocupa 2 MB.

El visor en modo mosaico con una cuadrícula de 2x2 fotos de paisajes y la galería de miniaturas a la izquierda
Un diseño de mosaico propio con una foto panorámica arriba y tres debajo, con la celda central seleccionada y sus asas para moverla y redimensionarlaEl desplegable de diseños de mosaico, de 1x2 Horizontal a 4x4 CuadrículaNueve fotos a la vez en una cuadrícula de 3x3El modo mosaico con el tema claro
instalador de Windows
2 MB
instalador de Windows
diseños de mosaico de serie
8
diseños de mosaico de serie
tests (Vitest)
177
tests (Vitest)
commits
261
commits

Qué hace

  • Mosaico configurable. Varias imágenes a la vez, en ocho diseños de serie (de 1x2 a 4x4) o en diseños propios con celdas que se mueven y redimensionan. Cada celda tiene su zoom, su desplazamiento y su giro, y se pueden sincronizar todas.
  • Navegar por celda o por página. Con una celda seleccionada, las flechas cambian solo esa imagen. Sin selección, o con Mayús, avanza el mosaico entero.
  • Autoreproducción. En vista única o en mosaico, por páginas enteras o solo en la celda seleccionada, con el intervalo que quieras y en orden aleatorio si se activa.
  • Galería. Miniaturas guardadas para que carguen al instante, búsqueda por nombre, favoritos con su pestaña, formato y dimensiones de cada imagen.
  • Visor. Zoom hacia el cursor, ajustar a la pantalla o al ancho, tamaño real, girar, voltear, pantalla completa y copiar la imagen o su ruta.
  • Escritorio. Abre las imágenes con doble clic desde el explorador y carga toda la carpeta. Recuerda las carpetas recientes, mueve a la papelera del sistema y muestra el archivo en el explorador.
  • Privado. No sube nada a ningún sitio. Tiene modo incógnito para no guardar la sesión ni las miniaturas.
  • Metadatos EXIF agrupados con aviso de GPS, atajos de teclado reasignables, tema claro u oscuro, e interfaz en español, inglés y chino.

Cómo está hecho

Una base de código, dos plataformas

Es una SPA de Nuxt sin servidor. La misma compilación se publica como web instalable en GitHub Pages y se empaqueta con Tauri como app de escritorio para Windows y Linux. Todo lo que cambia entre plataformas (abrir archivos, borrar del disco, mostrar en el explorador) pasa por una única interfaz, NativeBridge, con una versión web y otra de Tauri.

Tauri en vez de Electron

Tauri usa el WebView que ya trae el sistema en vez de meter un Chromium dentro de cada aplicación, y el backend es Rust. Por eso el instalador de Windows ocupa 2 MB y la app consume menos recursos. El backend son cuatro comandos propios: mover a la papelera, mostrar en el explorador, leer la carpeta de una imagen y recibir los archivos con los que se abrió.

Galerías grandes

La galería está virtualizada y un gestor limita a 60 las URLs de imagen vivas a la vez, con prioridad para lo visible, la imagen seleccionada y las celdas del mosaico. Las miniaturas se guardan en IndexedDB y los metadatos EXIF se leen en un Web Worker.

Problemas que resolví

  • Un escritorio que funcionaba como la web. Hasta la versión 1.0.3 la app no detectaba que estaba en Tauri, porque en Tauri 2 el objeto window.__TAURI__ solo existe si se activa una opción. Funcionaba porque la versión web también funciona dentro del WebView.
  • Fotos que no cargaban. Para mostrar archivos locales hacía falta activar el protocolo de assets de Tauri y darle un ámbito; sin eso, las URLs de las imágenes no cargaban.
  • Rutas con espacios. Para que el explorador abra la carpeta con el archivo seleccionado hay que llamar a explorer /select,"ruta". Rust entrecomilla el argumento entero cuando lleva espacios, y así explorer no reconoce la orden. Ahora el argumento se pasa tal cual.
  • Diseños que no se guardaban. Pinia entrega objetos reactivos y IndexedDB no los puede clonar. Diseños, preferencias, atajos y metadatos se convierten a objetos planos antes de guardarse.

Stack

Tauri 2RustNuxt 4Vue 3TypeScriptPiniaWeb WorkersIndexedDBexifrvue-virtual-scrollerPWAVitestGitHub Actions