2016-07-18 8 views
0

Ich muss auf Bitmap-Pixel asynchron arbeiten. Es gibt Bitmap und WriteableBitmap. Ich brauche so etwas wie:Asynchrone Bildverarbeitung in C#

public async Task<Bitmap> ProcessBitmap(Bitmap bitmap) 
{ 
    // operate on bitmap asynchronously 
    return newBitmap; 
} 

Ich wollte Writeablebitmap nutzen und wandeln es Strom Asynchron-Methoden zu streamen und zu verwenden, aber Pixelpuffer-Eigenschaft scheint sowohl in WPF und WinForms nicht verfügbar. Wie soll ich das machen? Ich könnte auch Parallel verwenden.Für einige Szenarien aber wie würde ich dann Ergebnisse bekommen?

+1

So können Sie so etwas wie 'var Dateien = new tun [] {"c: \ Datei1.bmp", "c: \ Datei2.bmp"}; var tasks = files.Select (x => ProcessBitmap (x)); warten auf Task.WhenAll (Aufgaben) '. Die 'WhenAll' wartet auf die Ausführung aller Aufgaben (hier ist die Parallelität. –

+0

Schauen Sie sich die Parallele Bibliothek in .NET an. Sie können damit alle Kerne der CPU für die Bildverarbeitung nutzen. Https: // msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx – Mangist

Antwort

5

Bildverarbeitung ist fast vollständig CPU-gebunden. Es gibt keine asynchronen E/A, die Sie ausnutzen könnten.

Verwechseln Sie nicht I/O-gebundenen Code (wo Async großartig funktioniert) mit CPU-gebundenem Code (wo Async keine Vorteile bietet, wirklich).

+0

Wahrscheinlich ist der Fragepunkt, dass die Verarbeitung auf einem anderen Thread ausgeführt werden sollte, um den UI-Thread nicht zu blockieren.So "asynchron" sollte gelesen werden als "auf einem parallelen Thread", nehme ich an. – dymanoid

1

Mit Task.Run Sie die CPU-intensiver Arbeit Threadpool senden können, so dass Ihr Thread frei ist, andere Arbeit zu tun, während warten:

public async void Button_Click(object sender, RoutedEventArgs e) { 
    ... 
    var processedBitmap = await ProcessBitmap(bitmap); 
    ... 
} 

public async Task<Bitmap> ProcessBitmap(Bitmap bitmap) { 
    //on bitmap asynchronously 
    await Task.Run(() => { 
     return DoActualBitmapProcessing(bitmap); 
    } 
} 
+1

Wo ist die return-Anweisung für die ProcessBitmap-Funktion? – KansaiRobot