2016-07-18 14 views
0

ビットマップピクセルを非同期で操作する必要があります。 BitmapとWriteableBitmapがあります。C#での非同期画像処理

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

私はストリームとストリーム非同期メソッドを使用するようにWriteableBitmapを使用し、それを変換したかったが、PixelBufferプロパティは、WPFとWinFormsの両方で使用できないようだ:私はのようなものを必要としています。私はこれをどのようにするべきですか?いくつかのシナリオでParallel.Forを使用することもできますが、どうすれば結果が得られますか?

+1

ですから、 'VARファイルのような何かを行うことができます=新しいです[] {"c:\ file1.bmp"、 "c:\ file2.bmp"}; var tasks = files.Select(x => ProcessBitmap(x)); Task.WhenAll(tasks) 'を待ちます。 'WhenAll'はすべてのタスクの実行を待ちます(ここでは並列処理です。) –

+0

.NETでParallelライブラリを使用すると、CPUのすべてのコアを利用して画像処理を行うことができます。 msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx – Mangist

答えて

5

画像処理はほぼCPUに拘束されています。悪用できる非同期I/Oはありません。

(非同期でうまく動作する)I/Oバウンドコードと、CPUバインドコード(実際には何の利点も得られない)と混同しないでください。あなたのスレッドが待っている間に他の作業を行うには無料ですので、あなたは、ThreadPoolのにCPU集約型の作業を送ることができますTask.Runで

+0

おそらく、問題点は、処理がUIスレッドをブロックしないように別のスレッドで実行されるということです。 '並列スレッドで'と読むといいでしょう。 – dymanoid

1

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

ProcessBitmap関数のreturn文はどこにありますか? – KansaiRobot