Ansel hereda de Darktable su estructura de base de datos: los historiales de edición no destructiva se guardan por imagen en una base de datos SQLite, junto con metadatos y otros datos definidos por el usuario. Hacer que la base de datos reconozca nuevas imágenes se realiza a través de la “importación” de imágenes desde un disco o tarjeta de memoria. Ahí es donde entra en juego la herramienta de importación.
Desafortunadamente, el importador de Darktable es otra cosa que fue estropeada alrededor de 2020 y se convirtió en algo profundamente desconcertante, ya que es un navegador de archivos que no se parece a ningún navegador de archivos conocido y logra carecer de funciones básicas (como Ctrl+F o vista previa de EXIF) mientras sigue estando lleno de características inútiles (ver abajo). Aquí es donde perdemos a muchos futuros usuarios, y es solo el paso 0 del flujo de trabajo. ¡Qué gran demostración de lo que puede hacer una “aplicación de flujo de trabajo”!
Una revisión de diseño sobre lo que el diseño por comité te conseguirá
Así que Darktable tiene los botones de importación en un widget de barra lateral. Hay 3 de ellos si conectaste una cámara a través de USB, 2 de lo contrario:
Muchas publicaciones en foros se han perdido explicando una y otra vez cuál era la diferencia entre añadir a la biblioteca e importar y copiar (importar en realidad significa añadir a la biblioteca). También vale la pena mencionar que el botón de montar cámara no hace más que lo que cualquier controlador PTP o MTP del sistema hace por ti: montar la tarjeta SD interna como almacenamiento USB externo, a través del puerto USB de la cámara. En Windows, esto requiere instalar un controlador USB personalizado que evitará que tu cámara funcione con el resto del sistema operativo. En Linux, dependiendo de si tu sistema operativo tiene habilitado el “auto-montaje”, es posible que tengas que desmontar la cámara desde el navegador de archivos de tu escritorio primero, de lo contrario, bloqueará el enlace. En todos los sistemas operativos, esto requiere escuchar nuevos dispositivos en segundo plano todo el tiempo para que la aplicación pueda reaccionar al enchufar en caliente, ya sea que vayas a usar la función o no.
Y luego están los parámetros. Desde 2022, el equipo de Darktable se ha enamorado locamente de esas bandejas plegables que esconden el desorden bajo más desorden. Y el desorden que puedes encontrar allí no hace más que presionar Ctrl+A (seleccionar todas las imágenes), y luego 0 o 1 (para asignar una calificación inicial de 0 o 1 estrella) o completar la información de metadatos (en lote) en el módulo homónimo, que se encuentra en la GUI de lighttable, te guste o no, y admite configuraciones predefinidas en caso de que siempre reutilices los mismos metadatos. La razón por la que agregar estos parámetros allí fue incluso un requisito en primer lugar se me escapa. Alguien, en algún lugar, probablemente está ahorrando 0,5 segundos por sesión de importación, que el resto del mundo está perdiendo al desplazarse más altura.
Entonces, siendo que entendiste las diferencias entre todas esas opciones, ahora haces clic en importar y copiar, que es probablemente la más utilizada ya que cualquier fotógrafo necesita vaciar las tarjetas SD en un almacenamiento más permanente. Y luego…
Esto básicamente es admitir que el diseño es tan terrible que roza lo inutilizable sin leer la documentación. Pero espera, ¿qué estamos haciendo de nuevo? Estamos copiando imágenes. ¿Estamos copiando imágenes? Entonces, ¿pasaste tu examen de copia de imágenes y obtuviste tu título de copia de imágenes? Si no lo hiciste, deberías. Cuidado, podrían convertir esto en un cuestionario en una versión futura y deshabilitar la función si no lo apruebas.
Así que haces clic en ese ominoso botón que dice que asumes toda la responsabilidad por cualquier daño que pueda ocurrir al copiar imágenes. O no lo haces, dado que parece algo aterrador. Pero supongamos que sí…
Espera, ¿dónde están las imágenes? ¿Es eso un lector de registros? Lanza 12 dados, y si sale un 8, descubrirás que esos íconos de ojos son receptivos y, una vez clicados, muestran una miniatura. Demonios, si haces clic en el ojo en el encabezado de la columna, mostrará todas las miniaturas a la vez. Y desordenará el espaciado de las filas, pero aquí competimos por la medalla de chocolate, así que es suficiente justo:
Siéntate para el resto, no estás preparado:
- La cosa de carpetas en la columna izquierda es en realidad un botón: cuando haces clic en él, cambia el orden de aparición de esas carpetas.
- El marco de lugares intenta emular el de favoritos o marcadores de tu gestor de escritorio del sistema operativo, pero no los importa.
- La casilla de verificación directorio recursivo no es una opción, es una acción. Pero luego no actúa sobre lo que seleccionaste en la columna derecha, porque esos son solo imágenes. Lo que hace es tomar la carpeta seleccionada en la columna izquierda y puebla la lista de imágenes buscando recursivamente en la carpeta seleccionada y sus hijos.
- La opción seleccionar imágenes nuevas es, una vez más, no una opción sino una acción, también conocido como algo que el resto del mundo pone en un botón.
- El campo anular la fecha de hoy es una solución para el hecho de que la fecha de
EXIF
de la imagen no se puede usar en los patrones de carpetas, así que por defecto usamos la fecha de hoy. Excepto si este campo está lleno. Pero necesita ser completado con una fecha y hora siguiendo el formato ISO 8601. Lo cual no hice aquí, y la ventana no se queja en absoluto porque la validación de entradas de formulario es menos divertida que dejar que los usuarios averigüen en el siguiente paso que deben comenzar de nuevo desde cero debido al mal formato de fecha y hora. Vaya, eso es mucho conocimiento de fondo para tener que completar una simple fecha, soy muy afortunado de haber aprendido todo eso leyendo el código fuente. - La opción mantener el nombre de archivo original es completamente redundante con el uso del patrón de nombres
$(FILE_NAME).$FILE_EXTENSION)
, - Los patrones de nombres usan máscaras de variables
$()
que se reemplazan en tiempo de ejecución por las propiedades reales del archivo, pero necesitas conocerlas para poder usarlas. Como si un tipo llamado Houz no hubiera escrito una biblioteca alrededor de 2011 para implementar la autocompletación en entradas de texto para esas variables, que simplemente puedes llamar en tu código para hacerlo funcionar en 2 líneas (se usa en el módulo de exportación). - Los patrones de nombres encontrados allí se duplican en la ventana de preferencias de Darktable porque podrías necesitar cambiarlos cuando no estás importando nada.
Esto está hecho del material de la frustración. Lo verdaderamente sorprendente es cuántas personas han trabajado en esta función durante los años para llegar a esto. Algunos lo llamarían inteligencia colectiva , pero en realidad se llama diseño por comité .
Una nueva perspectiva, o borrando la desaliñado desde el paso 0
Importar imágenes es verdaderamente el paso 0 de trabajar con cualquier aplicación de edición de imágenes. Es inaceptable perder usuarios tan temprano, especialmente cuando esperamos tanto de ellos más adelante, cuando se trata de entender la luz y el color. Pero argumentaré que la luz y el color son el pan y mantequilla de cualquier artista gráfico, y parece justo esperar que los usuarios de edición de fotos dominen los conceptos básicos de su oficio en algún momento.1 Por otro lado, pedir a los usuarios que obtengan su título de maestría en copia de archivos es inaceptable.
Guillaume Stutin y yo, por lo tanto, hemos reescrito completamente la herramienta de importación, primero el frontend y luego el backend. Aquí está el resultado.
La opción de montar directamente las tarjetas de memoria de cámaras desde GPhoto2 se ha eliminado por completo, ya que el sistema operativo puede manejar este paso directamente si es necesario. Solo hay un punto de entrada para importar. Luego obtienes la ventana del selector de archivos:
El navegador de archivos es un widget nativo de selector de archivos de Gtk, lo que significa que los marcadores del sistema operativo (e incluso aquí las carpetas sincronizadas de Nextcloud) se importan automáticamente desde el entorno de escritorio. La vista previa de la imagen se ha extendido con metadatos EXIF para identificar mejor las imágenes. Una búsqueda en la base de datos de la biblioteca muestra si la imagen ya se importó en Ansel o Darktable, y dónde.2
Los tipos de imágenes (raw, no raw o todos) se filtran utilizando filtros nativos de Gtk y la lista completa de archivos a importar se construye directamente en la GUI, sin segunda adivinación en el backend. Cuando se seleccionan carpetas, su contenido se busca automáticamente de forma recursiva y se muestra la primera imagen de la colección. El número final de imágenes detectadas se muestra debajo del selector de archivos:
Muchas opciones de clasificación y visualización son manejadas de manera nativa por el selector de archivos de Gtk, incluida la búsqueda (a través de Ctrl+F), sin trabajo adicional:
La opción de manejo de archivos permite la importación con o sin copia, la etiqueta explica la diferencia en palabras completas:
La fecha del proyecto se establece automáticamente en la de hoy, sin sobrescribir ni nada que sugiera que algo no revelado esté sucediendo por defecto. Para establecer la fecha, se proporciona un widget de calendario que automáticamente da formato a la fecha en el formato ISO correcto. Si la fecha se escribe directamente en el campo de texto, se realiza una validación de formato y se muestra una retroalimentación de error:


Ten en cuenta que solo la fecha (año, mes, día) es compatible con el widget de calendario. El establecimiento de la hora (hora, minuto, segundo) debe hacerse manualmente en el campo de texto. Las encuestas muestran que esto rara vez es necesario.
Los patrones de nombres de carpetas y archivos admiten autocompletado de variables automáticamente, cuando se escribe $(
. El nuevo backend de importación admite el uso de campos EXIF de imágenes para definir nombres de carpetas, por ejemplo, un patrón de carpeta como $(JOBCODE)-$(EXIF.ISO)
dividiría las imágenes en varias carpetas nombradas después de sus metadatos ISO. Cuando esto sucede, el lighttable abre la última carpeta creada cuando se cierra la ventana de importación:
Por último, pero no menos importante, una función solicitada por el usuario: la capacidad de previsualizar el resultado de los patrones definidos en la imagen seleccionada actualmente:
El resultado del patrón sigue a los archivos y carpetas seleccionados, así como cualquier cambio en la carpeta principal y los patrones. Ten en cuenta que el directorio base (para todos los proyectos) ya no acepta patrones, ya que no hay razón para poner patrones en todas partes, lo que permite utilizar un widget de lista de carpetas de Gtk seguro y sencillo. De esta manera, al menos la carpeta de nivel superior de Ansel se establece de manera sólida y fácil de usar, y si ocurre algún daño por patrones de nombres, estará encerrado dentro de algo predecible.
Conclusión
Cabe señalar que este diseño gráfico más simple también viene con una estructura de código mucho más simple, menos líneas y una lógica más lineal. El frontend necesita 1200 líneas, y el backend alrededor de 400 líneas (comentarios incluidos, el nuevo backend tiene docstrings de Doxygen casi por todas partes). Gran parte del volumen de código del frontend proviene del rastreador de carpetas recursivo, que se ejecuta en un hilo separado para no bloquear el hilo de la GUI, pero aún actualiza periódicamente el número de archivos para proporcionar retroalimentación. Esto ha sido probado con carpetas de más de 60.000 imágenes.
Darktable tiene más de 2700 líneas de frontend y más de 800 líneas de backend (sin docstrings). Además, la arquitectura de Darktable espera una carpeta de destino por sesión de importación, lo que prohíbe usar EXIF por imagen en los patrones de nombres de las carpetas, y tiene rutas de código completamente diferentes para manejar las discrepancias con copia/sin copia. Esto hace difícil mantener ambas rutas sincronizadas porque aún comparten algunos bits (agregar a la base de datos e inicializar metadatos). En Ansel, fusionamos ambas rutas con solo una E/S inicial opcional para copiar los archivos si es necesario.
El frontend y el backend de importación de Ansel se comunican a través de una lista de rutas de archivos estúpidamente simple, lo que significa que el backend no adivina las decisiones del usuario tomadas en la GUI. Además, todo el código de la GUI ha sido eliminado del backend. Este es un diseño genérico y robusto que permitirá formas alternativas de producir una lista de archivos para importar, por ejemplo, sin cabeza (desde un script). Anteriormente, cosas como el filtrado de JPG o el reordenamiento de archivos ocurrían en el backend.3
El principal atractivo del diseño depurado es que toda la información necesaria para entender qué es qué está accesible directamente en la ventana, sin necesidad de abrir una documentación. En caso de conflictos de nombres de archivo de destino durante la importación con copia, se advierte a los usuarios con una ventana emergente y los archivos existentes nunca se sobrescriben. No solo eso, todo el asunto se asemeja a un navegador de archivos típico.
Algunos usuarios también han expresado el deseo de utilizar las funciones de edición del software sin verse molestados por la rareza de la gestión interna de activos digitales (principalmente el lighttable). Este nuevo importador les permite abrir imágenes individuales directamente en el cuarto oscuro a través de doble clic en el archivo o clic en el archivo + clic en el botón de importar, ignorando efectivamente el lighttable por completo.
Los patrones de nombres, por supuesto, se han eliminado del menú de preferencias (que, por cierto, se puede encontrar en el menú global, a través de Editar → Preferencias, como en cualquier software razonable).
Muchas gracias a Guillaume Stutin por su arduo trabajo en este tema.
Note
El nuevo importador está disponible para versiones de compilación de Ansel > 0.0.0+780.Translated from English by : ChatGPT. In case of conflict, inconsistency or error, the English version shall prevail.
Yes, I know it’s already too much to ask in most cases. ↩︎
This reuses the Darktable code but with a clearer display. ↩︎
The whole notion of back-end vs. front-end is new to the Darktable ecosystem, as you will find GUI (Gtk) functions pretty much everywhere, protected by a recurring
if(darktable.gui)
to prevent segmentation faults when the software runs from CLI. ↩︎