C#中的异步图像处理
本文关键字:图像处理 异步 | 更新日期: 2023-09-27 17:57:33
我需要异步操作位图像素。有位图和可写位图。我需要类似的东西:
public async Task<Bitmap> ProcessBitmap(Bitmap bitmap)
{
// operate on bitmap asynchronously
return newBitmap;
}
我想使用WriteableBitmap并将其转换为流并使用流异步方法,但PixelBuffer属性似乎在WPF和WinForms中都不可用。我该怎么做?我也可以使用Parallel。在某些情况下,但我该如何获得结果?
图像处理几乎完全受CPU限制。没有异步I/O可以利用。
不要混淆I/O绑定代码(异步非常有效)和CPU绑定代码(实际上异步不会给您带来任何好处)。
使用Task.Run,您可以将CPU密集型工作发送到ThreadPool,这样您的线程就可以在等待时自由地做其他工作:
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);
}
}