2

我可以使用以下代码轻松地从资源 JPG 图像文件创建 BitmapImage ...

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 应用程序,所以可能是错误的,但我发现它过于复杂,因为洋葱皮太多。

4

1 回答 1

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);
    });
于 2012-07-21T21:03:00.773 回答