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。在某些情况下,但我该如何获得结果?

C#中的异步图像处理

图像处理几乎完全受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);
    }
}