Ansel erbt von Darktable seine Datenbankgrundlage: Die nicht-destruktiven Bearbeitungshistorien werden pro Bild in einer SQLite-Datenbank gespeichert, zusammen mit Metadaten und anderen benutzerdefinierten Daten. Das Bewusstmachen der Datenbank für neue Bilder erfolgt durch das „Importieren“ von Bildern von einer Festplatte oder einer Speicherkarte. Hier kommt das Importwerkzeug ins Spiel.

Leider ist der Darktable-Importer eine weitere Sache, die um das Jahr 2020 verstümmelt wurde und sich in etwas äußerst Verstörendes verwandelte, da er ein Datei-Browser ist, der keinem zuvor bekannten Datei-Browser ähnelt und grundlegende Funktionen (wie Strg+F oder EXIF-Vorschau) vermisst, während er dennoch mit nutzlosen Funktionen überladen ist (siehe unten). Hier verlieren wir viele potenzielle zukünftige Benutzer, und es ist nur der erste Schritt des Workflows. Was für ein großartiges Beispiel dafür, was eine „Workflow-App“ leisten kann!

Eine Designüberprüfung dessen, was Design durch Komitee erreichen kann

Darktable hat also die Importknöpfes auf einem Seitenleisten-Widget. Es sind 3, wenn Sie eine Kamera über USB angeschlossen haben, andernfalls 2:

image
Das Import-Modul im Lighttable

Viele Forenbeiträge wurden aufgewendet, um immer wieder zu erklären, was der Unterschied zwischen zur Bibliothek hinzufügen und importieren und kopieren (importieren bedeutet tatsächlich zur Bibliothek hinzufügen) war. Es ist auch erwähnenswert, dass die Schaltfläche Kamera einhängen nichts anderes tut als das, was ein systemweiter PTP  oder MTP  Treiber für Sie erledigt: Das Einhängen der internen SD-Karte als externen USB-Speicher über den USB-Port der Kamera. Unter Windows erfordert dies die Installation eines benutzerdefinierten USB-Treibers, der verhindert, dass Ihre Kamera mit dem Rest des Betriebssystems funktioniert. Unter Linux, abhängig davon, ob Ihr Betriebssystem „automatisches Einhängen“ aktiviert hat, müssen Sie möglicherweise die Kamera zuerst aus dem Datei-Browser Ihres Desktops aushängen, andernfalls wird die Verbindung gesperrt. Auf allen Betriebssystemen erfordert dies, ständig im Hintergrund auf neue Geräte zu achten, damit die Anwendung auf Hot-Plugging reagieren kann, egal ob Sie die Funktion nutzen werden oder nicht.

Und dann sind da die Parameter. Seit 2022 ist das Darktable-Team völlig in Liebe mit diesen einklappbaren Fächern, die die Überflüssigkeit unter noch mehr Überflüssigkeit verstecken. Und die Überflüssigkeit, die man dort findet, tut nichts anderes, als Strg+A zu drücken (alle Bilder auswählen), und dann 0 oder 1 (um eine Anfangsbewertung von 0 oder 1 Stern zuzuweisen) oder die Metadateninformationen (im Batch) im gleichnamigen Modul auszufüllen, was im Lighttable-UI steht, egal, ob es einem gefällt oder nicht, und Voreinstellungen unterstützt, falls man immer die gleichen Metadaten wiederverwendet. Warum diese Parameter überhaupt dort hinzugefügt werden mussten, ist mir schleierhaft. Irgendwo spart jemand wahrscheinlich 0,5 s pro Import-Sitzung, die der Rest der Welt verliert, indem er mehr scrollt.

Angenommen, Sie haben die Unterschiede zwischen all diesen Optionen verstanden, klicken Sie nun auf Importieren und Kopieren, was wahrscheinlich am häufigsten verwendet wird, da jeder Fotograf die SD-Karten auf einen dauerhafteren Speicher leeren muss. Und dann…

image
Haben Sie Ihr Datei-Kopieren-Examen bestanden, bevor Sie diese Funktion nutzen?

Dies bedeutet im Grunde, dass das Design so schrecklich ist, dass es an Dummheit grenzt, wenn man die Dokumentation nicht liest. Aber warten Sie, was machen wir eigentlich wieder? Wir kopieren Bilder. Wir kopieren Bilder? Also haben Sie Ihr Bild-Kopieren-Examen bestanden und Ihren Abschluss im Bild-Kopieren gemacht? Wenn nicht, sollten Sie es. Vorsicht, sie könnten dies in einen Test in einer zukünftigen Version verwandeln und die Funktion deaktivieren, wenn Sie ihn nicht bestehen.

Also klicken Sie auf diesen ominösen Knopf, der besagt, dass Sie die volle Verantwortung für jeglichen Schaden übernehmen, der durch das Kopieren von Bildern entstehen kann. Oder auch nicht, da es irgendwie einschüchternd aussieht. Aber sagen wir, Sie tun es…

image
Alles, was ich wollte, waren Bilder …

Warten Sie, wo sind die Bilder? Ist das ein Protokollleser? Werfen Sie einen 12-seitigen Würfel, und wenn Sie eine 8 treffen, werden Sie herausfinden, dass diese Augensymbole reaktionsfähig sind und bei einem Klick eine Miniaturansicht anzeigen. Wenn Sie auf das Auge im Spaltenkopf klicken, werden alle Miniaturansichten gleichzeitig angezeigt. Und die Zeilenabstände durcheinanderbringen, aber wir laufen hier um die Schokoladenmedaille, also ist das in Ordnung:

image

Setzen Sie sich für den Rest, Sie sind nicht bereit:

  1. Das Ordner-Ding in der linken Spalte ist tatsächlich ein Knopf: Wenn Sie darauf klicken, ändert sich die Reihenfolge der Anzeige dieser Ordner.
  2. Der Orte-Rahmen versucht, das Favoriten oder Lesezeichen Ihres OS-Desktop-Managers zu emulieren, importiert sie aber nicht.
  3. Das Kontrollkästchen Rekursives Verzeichnis ist keine Option, sondern eine Aktion. Aber dann wirkt es nicht auf das, was Sie in der rechten Spalte ausgewählt haben, denn das sind nur Bilder. Es nimmt den in der linken Spalte ausgewählten Ordner und füllt die Bilderliste, indem es rekursiv den ausgewählten Ordner und seine Unterordner durchforstet.
  4. Die neue Bilder auswählen ist wiederum keine Option, sondern eine Aktion, also etwas, das der Rest der Welt in einen Knopf steckt.
  5. Das Feld heutiges Datum überschreiben ist ein Workaround dafür, dass das Bild-EXIF-Datum nicht in Ordnermustern verwendet werden kann, daher verwenden wir standardmäßig das heutige Datum. Außer wenn dieses Feld ausgefüllt ist. Es muss jedoch mit einem Datum im ISO 8601-Format gefüllt werden. Diesen habe ich hier nicht befolgt, und das Fenster beschwert sich überhaupt nicht, denn die Validierung von Formulareingaben ist weniger lustig, als Benutzern zu überlassen, beim nächsten Schritt herauszufinden, dass sie aufgrund eines falschen Datumsformats von vorne beginnen müssen. Junge, das ist eine Menge Hintergrundwissen, um ein verdammtes Datum einzugeben, ich habe großes Glück, dass ich all das durch Lesen des Quellcodes gelernt habe.
  6. Die Option Originaldateiname beibehalten ist vollständig redundant mit der Verwendung des Namensmusters $(FILE_NAME).$FILE_EXTENSION),
  7. Die Namensmuster verwenden Variablenmasken $(), die zur Laufzeit durch die tatsächlichen Eigenschaften der Datei ersetzt werden, aber man muss sie kennen, um sie verwenden zu können. Als wäre ein Typ namens Houz nicht etwa 2011 eine Bibliothek geschrieben, um die Autovervollständigung von Texteingaben für diese Variablen zu implementieren, die man einfach in seinem Code aufrufen kann, um sie in 2 Zeilen funktionsfähig zu machen (sie wird im Exportmodul verwendet).
  8. Die im Importfenster gefundenen Namensmuster werden in den Darktable-Einstellungen verdoppelt, da man sie möglicherweise ändern muss, wenn nichts importiert wird.

Das ist der Stoff, aus dem die Frustration gemacht ist. Was wirklich erstaunlich ist, ist, wie viele Personen im Laufe der Jahre an dieser Funktion gearbeitet haben, um dorthin zu gelangen. Einige würden es kollektive Intelligenz  nennen, aber es wird tatsächlich Design durch Komitee  genannt.

Ein neuer Ansatz oder das Entfernen von Schrammen aus Schritt 0

Bilder zu importieren ist wirklich der Schritt 0, um mit jeder Bildbearbeitungsanwendung zu arbeiten. Es ist inakzeptabel, Benutzer so früh zu verlieren, insbesondere da wir später so viel von ihnen erwarten, wenn es darum geht, Licht und Farbe zu verstehen. Aber ich werde argumentieren, dass Licht und Farbe das tägliche Brot eines jeden Grafikkünstlers sind, und es scheint fair, von Foto-Bearbeitungsbenutzern zu erwarten, dass sie die Grundlagen ihres Handwerks irgendwann beherrschen.1 Auf der anderen Seite ist es inakzeptabel, von Benutzern zu verlangen, dass sie ihren Masterabschluss im Kopieren von Dateien machen.

Guillaume Stutin und ich haben daher das Importwerkzeug vollständig neu geschrieben, zuerst das Front-End und dann das Back-End. Hier ist das Ergebnis.

image
Das Importfenster wird aus dem globalen Menü geöffnet, optional mit dem Shortcut

Die Option, Kameraspeicherkarten direkt von GPhoto2 einzubinden, wurde komplett entfernt, da das Betriebssystem diesen Schritt bei Bedarf direkt erledigen kann. Es gibt nur einen Einstiegspunkt für den Import. Dann erhalten Sie das Dateiauswahlfenster:

image
Das Importfenster ist ein natives Gtk-Dateiauswahl-Widget

Der Datei-Browser ist ein natives Gtk-Dateiauswahl-Widget, was bedeutet, dass die OS-Lesezeichen (und sogar hier die synchronisierten Ordner von Nextcloud) automatisch aus der Desktop-Umgebung importiert werden. Die Bildvorschau wurde mit EXIF-Metadaten erweitert, um Bilder besser zu identifizieren. Ein Abgleich in der Bibliotheksdatenbank zeigt, ob das Bild bereits in Ansel oder Darktable importiert wurde und wo.2

Bildtypen (Roh, Nicht-Roh oder alle) werden mithilfe nativer Gtk-Filter gefiltert und die vollständige Liste der zu importierenden Dateien wird direkt in der GUI erstellt, ohne Vermutungen im Hintergrund. Wenn Ordner ausgewählt werden, wird deren Inhalt automatisch rekursiv durchsucht und das erste Bild der Sammlung angezeigt. Die endgültige Anzahl der erkannten Bilder wird unter dem Datei-Auswahlfenster angezeigt:

image

Viele Sortier- und Anzeigeoptionen werden nativ vom Gtk-Dateiauswahl-Widget gehandhabt, einschließlich der Suche (durch Strg+F), ohne Zusatzarbeit:

image

Die Dateiverwaltungsoption ermöglicht den Import mit oder ohne Kopie, das Etikett erklärt den Unterschied ausführlich:

image

Das Projekt-Datum wird automatisch auf das heutige Datum gesetzt, keine Überschreibung oder irgendetwas, was andeutet, dass standardmäßig etwas Unbekanntes anders passiert. Um das Datum festzulegen, wird ein Kalender-Widget bereitgestellt, das das Datum automatisch im richtigen ISO-Format formatiert. Wenn das Datum direkt in das Texteintragfeld eingegeben wird, wird eine Formatvalidierung durchgeführt und eine Fehlerbenachrichtigung angezeigt:

Beachten Sie, dass das Kalender-Widget nur das Datum (Jahr, Monat, Tag) unterstützt. Die Uhrzeit (Stunde, Minute, Sekunde) muss manuell im Texteingabefeld festgelegt werden. Umfragen zeigen, dass dies selten benötigt wird.

Die Ordner- und Dateibenennungsmuster unterstützen Variablen-Autovervollständigung automatisch, wenn $( eingegeben wird. Das neue Import-Back-End unterstützt die Verwendung von EXIF-Feldern von Bildern zur Definition von Ordnernamen, zum Beispiel würde ein Ordner-Muster wie $(JOBCODE)-$(EXIF.ISO) Bilder in mehrere Ordner aufteilen, die nach ihren ISO-Metadaten benannt sind. Wenn dies passiert, öffnet das Lighttable den zuletzt erstellten Ordner, wenn das Importfenster geschlossen wird:

image

Nicht zuletzt eine vom Benutzer angeforderte Funktion: In der Lage sein, das Ergebnis der auf das aktuell ausgewählte Bild angewendeten Muster zu sehen:

image

Das Musterergebnis folgt den ausgewählten Dateien und Orden sowie allen Änderungen im Hauptordner und den Mustern. Beachten Sie, dass das Basisverzeichnis (für alle Projekte) keine Muster mehr akzeptiert, da es keinen Grund gibt, überall Muster einzufügen, was ermöglicht, ein sicheres und einfaches Gtk-Ordnerlisten-Widget zu verwenden. Auf diese Weise wird zumindest der oberste Ansel-Ordner robust und benutzerfreundlich eingerichtet, und falls Schäden durch Benennungsmuster auftreten, werden sie in etwas Vorhersehbaren eingeschlossen.

Schlussfolgerung

Es sollte beachtet werden, dass dieses einfachere grafische Design auch mit einer viel einfacheren Code-Struktur, weniger Zeilen und einer lineareren Logik einhergeht. Das Front-End benötigt 1200 Zeilen, und das Back-End um die 400 Zeilen (Kommentare eingeschlossen, das neue Backend hat fast überall Doxygen-Dokumentationszeilen). Ein Großteil des Code-Volumens des Front-Ends kommt vom rekursiven Ordner-Durchlauf, der in einem separaten Thread läuft, um den GUI-Thread nicht zu blockieren, aber dennoch die Datei-Anzahl periodisch zur Rückmeldung aktualisiert. Dies wurde mit Ordnern von über 60.000 Bildern getestet.

Darktable hat mehr als 2700 Zeilen an Front-End und mehr als 800 Zeilen an Back-End (keine Dokumentationszeilen). Außerdem erwartet die Architektur von Darktable ein Zielverzeichnis pro Importsitzung, was es untersagt, pro Bild-EXIF im Ordner-Benennungsmuster zu verwenden, und hat völlig verschiedene Codepfade, um die Unterschiede mit Kopie/ohne Kopie zu handhaben. Dies macht es schwierig, beide Wege synchron zu halten, da sie dennoch einige Teile teilen (Hinzufügen zur Datenbank und Initialisieren von Metadaten). In Ansel haben wir beide Wege zusammengeführt, wobei nur eine optionale erste I/O vorhanden ist, um die Dateien bei Bedarf zu kopieren.

Ansel’s Front-End und Back-End-Import kommunizieren durch eine dumm-einfache Liste von Dateipfaden, was bedeutet, dass das Back-End nicht zweifelt, welche Entscheidung der Benutzer in der GUI getroffen hat. Außerdem wurde der gesamte GUI-Code aus dem Backend entfernt. Dies ist ein generisches und robusteres Design, das alternative Wege ermöglicht, um eine Liste von zu importierenden Dateien zu erzeugen, beispielsweise kopflos (von einem Skript aus). Vorher passierten Dinge wie JPG-Filter oder Dateien-Reihenfolge im Backend.3

Der Hauptanreiz des gestrafften Designs ist, dass alle notwendigen Informationen, um zu verstehen, was was ist, direkt im Fenster zugänglich sind, ohne dass man eine Dokumentation öffnen muss. Im Falle von Konflikten bei Dateinamen während des Imports mit Kopie werden die Benutzer mit einem Popup-Fenster gewarnt und bestehende Dateien werden niemals überschrieben. Ganz zu schweigen davon, dass das Ganze einem typischen Datei-Browser ähnelt.

Einige Benutzer haben auch den Wunsch geäußert, die Bearbeitungsfunktionen der Software zu nutzen, ohne durch die Besonderheiten des internen digitalen Asset-Managements (meist das Lighttable) gestört zu werden. Dieser neue Importer ermöglicht es ihnen, einzelne Bilder direkt in das Darkroom zu öffnen, durch Doppelklick auf die Datei oder Klick auf die Datei + Klick auf den Import-Knopf und damit das Lighttable vollständig zu umgehen.

Die Namensmuster wurden natürlich aus dem Einstellungs-Popup entfernt (das im Übrigen über das globale Menü gefunden werden kann, durch BearbeitenEinstellungen, wie in jeder vernünftigen Software).

Vielen Dank an Guillaume Stutin für seine mühevolle Arbeit zu diesem Thema.


Translated from English by : ChatGPT. In case of conflict, inconsistency or error, the English version shall prevail.

  1. Yes, I know it’s already too much to ask in most cases. ↩︎

  2. This reuses the Darktable code but with a clearer display. ↩︎

  3. 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. ↩︎