2014-03-25 80 views
1

我正在使用諾基亞映像SDK 1.1的圖像應用程序。看起來相當簡單的任務(讓用戶選擇圖像並應用一些過濾器)目前阻止我2天。 我寫了數百行文章,並回顧了所有諾基亞Dev開發示例(其中大部分時間都非常順利,但對於像我這樣的映像SDK初學者來說太複雜了),但我總是會得到以下例外:無效的指針在Nokia.Graphics.Imaging.BitmapRender.RenderAsync()

{System.NullReferenceException: Invalid pointer at Nokia.Graphics.Imaging.BitmapRenderer.RenderAsync() 

這是代碼(我已經減少了在過濾器傳遞所以只是一個空FilterEffect傳遞上簡單的部分):

PhotoChooserTask task = new PhotoChooserTask(); 
task.Completed += async (result,choosen) => 
    { 
     Stream stream = choosen.ChosenPhoto; 
     BitmapImage bitmapImage = new BitmapImage(); 
     bitmapImage.SetSource(stream); 
     WriteableBitmap bitmap = new WriteableBitmap(bitmapImage); 
     WriteableBitmapRenderer renderer = new WriteableBitmapRenderer(new FilterEffect(), bitmap, OutputOption.PreserveAspectRatio); 
      await renderer.RenderAsync(); 
    }; 
task.ShowCamera = true; 
task.Show(); 

所以,如果我明白了一切順利,該應用程序是因爲某種無效指針被傳遞而崩潰,但它有效的位圖 - 或者至少它的大小是正確的,所以我猜測,數據也被傳遞了。

無論如何,這裏是堆棧跟蹤

at Nokia.Graphics.Imaging.BitmapRenderer.RenderAsync() 
at Nokia.Graphics.Imaging.WriteableBitmapRenderer.<<RenderAsync>b__0>d__1.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
at RealtimeFilterDemo.MainPage.<<ShutterButton_Tap>b__1a>d__1c.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__0(Object state) 

回答

4

你不是要設置源圖像的FilterEffect,而是直接傳遞源流到目標 WriteableBitmap的出於某種原因。

當您啓動RenderAsync操作時,FilterEffect Source屬性爲null,這是導致異常的原因。您應該將圖像源傳入FilterEffect構造函數,或設置其Source屬性。

我推薦一個StreamImageSource,因爲你已經有了一個帶有圖像數據的System.IO.Stream。

概念上,這是怎麼想的吧:

選擇照片流 - > StreamImageSource - > FilterEffect - > WriteableBitmapRenderer - >可寫的位圖

而且更具體:

using(var streamSource = new StreamImageSource(stream)) 
using(var filterEffect = new FilterEffect(streamSource, filters)) 
using(var writeableBitmapRenderer = new WriteableBitmapRenderer(filterEffect, writeableBitmap)) 
{ 
    await writeableBitmapRenderer.RenderAsync(); 
    .... 
} 
+0

謝謝很多!似乎工作。我猜想它會發生,因爲Imaging SDK文檔太差:) – jalgames

+0

實際上,應該有許多與上述相似的示例。 :)你想看到什麼添加到文檔? –

+0

我想問題是所有的樣本都很複雜。我的意思是,上面的代碼實質上就是您需要的一個簡單的過濾器應用程序,但所有示例都包含數十個包含數百個代碼行的助手類的文件。只是簡單的超級機制來理解所有的代碼太複雜了。 – jalgames