2016-05-27 1 views
3

Ich habe eine einfache Anwendung geschrieben, die durch einen Ordner scrollt und zeigt die Fotos in diesem Ordner und der Benutzer kann die Datei überprüfen und wählen Sie mehrere Aktionen mit Foto vor dem Klicken auf den nächsten. Die Anwendung funktioniert gut und wenn Sie sogar große Jpegs (15-19 MB) verwenden, scrollt es sehr schnell durch. (Keine Verzögerung zwischen Bildern), aber wenn es um die RAW-Dateien geht (20 - 25 MB), dauert es 3-4 Sekunden, bis das nächste Bild geladen wird, nachdem der Benutzer auf den nächsten klickt.Wie kann ich große Kamera RAW - Dateien (NEF) schneller in WPF

Ich habe versucht, verschiedene Optionen wie BitmapImage.bi.DecodePixelHeight = 1080 (funktioniert fantastisch für JPegs aber ändert die Farben etc der Raw-Datei so unbrauchbar) Ich habe versucht, mit einem Hintergrund-Worker, um die nächste zu laden Datei in der Warteschlange in den Speicher, das funktioniert ganz gut, wenn Sie den Benutzer genügend Zeit verbringen, das aktuelle Bild zu überprüfen, aber wenn Sie schnell durch die Bilder scrollen, erhalten Sie einen Fehler "Hintergrundarbeiter ist derzeit beschäftigt". Ich weiß, dass es getan werden kann, weil die Windows 10 App "Fotos" schnell durch die NEF-Dateien scrollen können und ich möchte nur ein paar Ratschläge, wie ich gehen sollte, um die gleiche Geschwindigkeit wie diese zu erreichen.

Gibt es eine bessere Möglichkeit, die Bilder im Hintergrund zu laden, gibt es eine Möglichkeit, die rohen Dateien zu komprimieren, um sie bei 1920 * 1080 anzuzeigen, bevor sie geladen werden (derzeit sind sie 6000 * 4000) oder irgendwelche anderen Ideen sehr hilfreich

Antwort

2

Was Sie versuchen können zu tun ist, extrahieren Sie eingebettete JPEG-Bild aus dieser Raw-Datei. Die meisten (vielleicht sogar alle) Kameras enthalten JPEG in voller Größe innerhalb dieses RAW, was für Ihre Vorschau in Ordnung sein sollte. Ich habe dcraw Werkzeug dafür verwendet (here sind Dokumente). Um es von .NET-Code aufrufen, rufen Sie einfach es über Process.Start:

private void ExtractJpegFromRaw(string raw, string outputPath) { 
    if (!File.Exists(raw)) return; 
    var dcraw = Path.Combine("path to dcraw.exe here"); 
    var command = String.Format("\"{0}\" -e -c -t 0 \"{1}\" > \"{2}\"", dcraw, raw, outputPath); 
    var p = new Process(); 
    p.StartInfo = new ProcessStartInfo("cmd", String.Format("/c \"{0}\"", command)); 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.CreateNoWindow = true; 
    p.Start(); 
    p.WaitForExit();  
} 

Ich muss sagen, ich habe nicht Perfomance dieser Maßnahme, sondern Extrahieren bereits bestehenden jpeg sollte schnell sein. Also, was Sie tun können, ist diesen Code auszuführen, dann zeigen Sie jpeg, und Sie können diese Vorschau zwischenspeichern und das nächste Mal wird der Benutzer die gleiche Raw anzeigen - Sie haben JPEG bereits vorbereitet (das ist, was die meisten Foto-Viewer-Tools tun - sie Cache-Vorschau) .

+0

Sie absolute Legende, das funktioniert erstaunlich gut dank einer Million. –

+0

Gut zu wissen! Aus Interesse - wie viel Beschleunigung hast du davon bekommen? – Evk

+0

unermessliche Verbesserung, es dauerte etwa 3-4 Sekunden, um das nächste Bild praktisch sofort zu laden. Meine sterblichen Augen können die Verzögerung nicht wirklich erkennen (falls vorhanden) –

Verwandte Themen