Da mir einige Leute in den Fragenkommentaren wiederholt sagten, es sei eher trivial, habe ich es tatsächlich getan: Eine Anwendung, die die Bilder im aktuellen Verzeichnis sortiert, indem sie den tatsächlichen Kopf-an-Kopf-Vergleich dem Benutzer überlässt . 1
Geschrieben in C # für .NET 2. Funktioniert auch unter Mono (bisher unter Linux getestet). Erfordert dcraw auf dem PATH (kompilierte ausführbare Datei für Windows oder OS X kann hier heruntergeladen werden ).
Derzeit ist die Benutzerinteraktion sehr rudimentär. Dies kann sich möglicherweise ändern. Auch der Code ist ein böses Durcheinander, wie es bei einem solchen Hack-Job üblich ist.
Die Anwendung muss in einem Verzeichnis gestartet werden, das die zu sortierenden Bilder enthält. Anschließend werden alle Bilder geladen, die gefunden und verarbeitet werden können (JPEG, GIF, PNG, BMP werden von Haus aus unterstützt, alle anderen Formate werden entweder von dcraw unterstützt oder übersprungen, wenn dies nicht der Fall ist). Halten Sie die Anzahl der Bilder in einem vernünftigen Verhältnis, da jedes Bild im Speicher vorinstalliert ist, um die Anzeige zu beschleunigen. Ich habe versucht, es in einem Ordner mit ca. 600 Bildern zu starten und bei einer Speichernutzung von ca. 2 GB zu beenden.
Danach erhalten Sie eine Zwei-Fenster-Ansicht mit einem Bild links und rechts. Klicken Sie auf diejenige, die Sie für die beste von beiden halten. Sie erhalten dann zwei neue Bilder. Fahren Sie fort, bis Sie fertig sind. Sie können das Programm schließen, wenn Sie möchten. Es wird an der Stelle fortgesetzt, an der Sie aufgehört haben.
Nachdem alle erforderlichen Vergleiche durchgeführt wurden 2, ist das Ergebnis zu sehen:
Auf der linken Seite befindet sich die sortierte Liste der Bilder mit dem höchsten Rang oben und dem niedrigsten Rang unten.
Aufgabenliste:
- Erlaube die Auswahl der zu sortierenden Bilder.
- Lösen Sie das Problem, dass Porträtbilder immer im Querformat angezeigt werden (zumindest bei Rohbildern. Dcraw ermöglicht die Drehung, kann dies jedoch nicht automatisch und ich sehe keinen einfachen Weg, dies extern herauszufinden).
- Reduzieren Sie die Speichernutzung für eine große Anzahl von Bildern.
- Mische die Bilder im Voraus, damit Serien von nahezu identischen Bildern mit geringerer Wahrscheinlichkeit direkt miteinander verglichen werden.
- Ändern Sie die Synchronisierung zwischen dem Sortierthread und der Benutzeroberfläche, um nicht mehr auf
Thread.Sleep
Abfragen zu vertrauen, sondern die richtigen Synchronisierungsmethoden zu verwenden.
- Fügen Sie eine 1: 1-Vorschau hinzu (oder zumindest eine größere). Derzeit kann dies nicht verwendet werden, um Dinge auf Pixelebene zu beurteilen.
Es ist 5:26 hier, also höre ich jetzt auf, mich daran zu hacken.
Der Quellcode befindet sich in meinem SVN-Repository und ist unter der MIT-Lizenz veröffentlicht. Ich freue mich über Patches ;-)
Die Bilder in den obigen Screenshots stammen von mir.
1 Natürlich war es nicht so trivial, wie andere mich glauben machen wollten. Nach einem langen Kampf mit Libraw bin ich einfach den Dcraw-Weg gegangen. Nicht hübsch, funktioniert aber mit minimaler Menge an Code.
2 Dies liegt in der Größenordnung von n log 2 n, wobei n die Anzahl der verglichenen Bilder ist. Bei 20 Bildern können Sie also mit etwa 20 × 4,3 × 85 Vergleichen rechnen. Ich weiß, es ist keine kleine Zahl. Für die 300 Bilder, die Sie erwähnt haben, würden Sie ungefähr 2400 erhalten. Die tatsächliche Anzahl, die manuell durchgeführt werden muss, ist (a) anders (da der lineare Faktor bei der Komplexität weggelassen wird) und (b), soweit ich dies bisher beobachtet habe, kleiner. Um Inkonsistenzen zu vermeiden, wird der Benutzer niemals zweimal zu denselben zwei Bildern (in jeder Reihenfolge) und niemals zu demselben Bild auf beiden Seiten aufgefordert.