single.php

C# WinUI3でZipファイル内の画像ファイルのBitmapを取得したい場合の対処法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトでZipファイル内の画像ファイルを、Bitmapオブジェクトとして取得する場合の対処法です。

非同期処理のSetSourceAsyncで取得

例えば、非同期型のプロシージャーを用意して、Zipファイル内のエントリーからストリームを取得してBitmapクラスのSetSourceAsyncメソッドで取得できます。

private async Task<BitmapImage> GetBitmapFromZip(string zipPath, string entryName)
{
    var archive = ZipFile.OpenRead(zipPath);
    var entry = archive.GetEntry(entryName);

    if(entry == null)
    {
        return new BitmapImage();
    }

    using var entryStream = entry.Open();
    var mem = new MemoryStream();
    await entryStream.CopyToAsync(mem);
    mem.Position = 0;
    var bitmap = new BitmapImage();
    await bitmap.SetSourceAsync(mem.AsRandomAccessStream());

    return bitmap;
}

Bitmapクラスで画像リソースを使う場合には SetSource メソッドを使いますが、WinUI3プロジェクトでは、期待通りに動作してくれません。

非同期処理の SetSourceAsync の方が安定して画像を取得できました。

また、複数の画像などをリストにして表示したい場合など、1つの処理を待つことなく連続して処理を並列で行うようになるので効率的に処理が進みます。

[WhenAll]でTaskの処理を取得

非同期処理するプロシージャーを連続して呼び出すと、すべての処理が終了するタイミングが取得したくなります。

例えば、並べた画像をソートしてから表示したい場合など、ループ処理などで複数回実行させた非同期処理をまとめて管理するには Task クラスの WhenAll メソッドが使えます。

詳しい使い方は、別記事をご覧ください。

まとめ

今回は、短い記事ですが、WinUI3プロジェクトでZipファイル内の画像ファイルを、Bitmapオブジェクトとして取得する場合の対処法について紹介しました。

非同期型のプロシージャーを用意して、Zipファイル内のエントリーからストリームを取得してBitmapクラスのSetSourceAsyncメソッドで取得できます。

WinUI 3 アプリで、Zipファイル内の画像データを取得したいの人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です