2012-07-21 96 views
2

我可以輕鬆地創建使用下面的代碼資源JPG圖像文件的BitmapImage ...如何使用C++ for Windows Metro應用程序從資源圖像創建WritebleBitmap?

Windows::Foundation::Uri^ uri = ref new Windows::Foundation::Uri(L"ms-appx:///Hippo.JPG"); 
Imaging::BitmapImage^ image = ref new Imaging::BitmapImage(uri); 

但WritableBitmap不採取URI。我看到一個SetSource方法,但需要一個IRandomaccessStream而不是Uri。我不知道如何從JPG文件創建一個。我一遍又一遍地搜索網絡,但找不到一個簡單的答案。任何幫助將不勝感激。

我想是這樣的......

Windows::UI::Xaml::Media::Imaging::WriteableBitmap image = ref new Windows::UI::Xaml::Media::Imaging::WriteableBitmap(); 
image->SetSource(somehowGetRandomAccessStreamFromUri); 

但是,我如何才能從一個URI的IRandomaccessStream實例?我今天才開始研究C++ Metro應用程序,因此可能是錯誤的,但我發現它太過複雜,太多的洋蔥剝皮。

回答

2

在C#中,你會做這樣的事情

var storageFile = await Package.Current.InstalledLocation.GetFileAsync(relativePath.Replace('/', '\\')); 
var stream = await storageFile.OpenReadAsync(); 
var wb = new WriteableBitmap(1, 1); 
wb.SetSource(stream); 

我想在C++/CX你會做這樣的事情:

#include <ppl.h> 
#include <ppltasks.h> 

... 

Concurrency::task<Windows::Storage::StorageFile^> getFileTask 
    (Package::Current->InstalledLocation->GetFileAsync(L"Assets\\MyImage.jpg")); 

auto getStreamTask = getFileTask.then(
    [] (Windows::Storage::StorageFile ^storageFile) 
    { 
     return storageFile->OpenReadAsync(); 
    }); 

getStreamTask.then(
    [] (Windows::Storage::Streams::IRandomAccessStreamWithContentType^ stream) 
    { 
     auto wb = ref new Windows::UI::Xaml::Media::Imaging::WriteableBitmap(1, 1); 
     wb->SetSource(stream); 
    }); 
+0

感謝菲利普,它的工作就像一個魅力。儘管如此,我不得不做一點小改變。由於某些原因,我得到一個無效的參數異常,將L「Assets \\ MyImage.jpg」更改爲L「MyImage.jpg」。 – abix 2012-07-22 02:46:55

+0

終於搞清楚了,WritableBitmap的像素內容既不可讀也不可寫:(我可以得到一個IBuffer指針,它不提供對它緩衝區的訪問!不管怎麼說,這是一個單獨的問題,在一起 – abix 2012-07-22 05:05:09

+0

@abix在C#中,我使用了[AsStream ](http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.windowsruntime.windowsruntimebufferextensions.asstream(v = vs.110).aspx#Y0)方法將緩衝區轉換爲I/O流。它必須在C++中可行。請檢查C#示例[here](http://bit.ly/WinRTXamlToolkit)。 – 2012-07-22 10:29:36

相關問題