WindowsストアアプリでSystem.IO.Stream型のストリームからWindows.Storage.Streams.IBuffer型のオブジェクトへ変換する

By | 2013/12/03
Pocket

WindowsストアアプリでSystem.IO.Stream型のストリームからIBufferオブジェクトへ変換する方法をご紹介します。

事前にusingディレクティブにSystem.Runtime.InteropServices.WindowsRuntime名前空間を宣言しておきます。System.IO.Stream型のストリームからbyte型配列に一旦データを読み込んで、byte型配列の拡張メソッドを使ってIBuffer型のオブジェクトへ変換します。

// using System.Runtime.InteropServices.WindowsRuntime;

IBuffer buffer = null;
using (System.IO.Stream strm = GetStream())
using (var reader = new System.IO.BinaryReader(strm))
{
    var bytes = new byte[strm.Length];
    reader.Read(bytes, 0, bytes.Length);
    buffer = bytes.AsBuffer();
}

### ネット上の画像をダウンロードする

応用例を紹介します。System.Net.Http名前空間のHttpClientクラスを使ってインターネット上の画像ファイルのストリームを取得して、Stream型からIBuffer型に変換して上で、ファイルをアプリテンポラリフォルダへ保存しています。

// using System.Runtime.InteropServices.WindowsRuntime;

var imageUrl = "http://example.com/hoge.jpg";

var temp = Windows.Storage.ApplicationData.Current.TemporaryFolder;
var fileName = "hoge.jpg";

var client = new System.Net.Http.HttpClient();
using (var strm = await client.GetStreamAsync(new Uri(imageUrl)))
using (var reader = new System.IO.BinaryReader(strm))
{
    var bytes = new byte[strm.Length];
    reader.Read(bytes, 0, bytes.Length);
    var buffer = bytes.AsBuffer();

    // ファイルに保存する
    var file = await temp.CreateFileAsync(fileName,
                         CreationCollisionOption.ReplaceExisting);
    using (var fileStrm = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        await fileStrm.WriteAsync(buffer);
    }
}