簡體   English   中英

在非 ui 線程上處理圖像

[英]Process image on non-ui thread

我目前有一個WriteableBitmap ,我想在非 UI 線程上處理它

我基本上想重用作為我的圖像控件源的圖像並在 Task.Run 中處理它。

WriteableBitmap bitmap;

Task.Run(() =>
{
     // Process the bitmap here
});

不幸的是,我收到以下異常,因為它在 UI 線程上被阻止

調用線程無法訪問此對象,因為其他線程擁有它。

注意 - 我不想在 UI 線程上處理代碼!

有人能幫助我嗎?

像WriteableBitmap這樣的對象必須在它們創建的線程上使用。 所以你必須在另一個線程上分配它。

如果您希望在處理工作線程后在UI上使用已處理的圖像,則應執行以下操作之一:

  • 將結果復制回UI(即通過copyPixels)。
  • 凍結對象(您必須在工作線程上調用Freeze()方法)。 然后你不能再改變對象了,但是你可以在你想要的任何線程上將它用於只讀。

WriteableBitmapDispatcherObject ,只有創建Dispatcher的線程才可以直接訪問DispatcherObject 要從創建DispatcherObject的線程以外的線程訪問DispatcherObject ,我們需要在與DispatcherObject關聯的Dispatcher上調用Invoke或BeginInvoke。 委托將在該線程上執行,因此渲染線程將阻塞。

如果您想使用原始像素數據, WriteableBitmap將是一個不錯的選擇。 我們可以使用WriteableBitmap的CopyPixels方法將像素數據加載到int數組中,在我們修改int array的數據后,我們可以使用WritePixels方法更新WriteableBitmap的像素。 所以,也許你可以嘗試在后台線程中操作int數組。

創建要寫入Task中WriteableBitmap的像素數據(數組),並在GUI線程上執行Write。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM