空雲 Blog

Eye catch
WinUI 3 で作る Windows 用マルチメディア Viewer Quick Image Viewer の開発

publication: 2026/05/13
update:2026/05/13

WinUI 3 で作る Windows 用マルチメディア Viewer Quick Image Viewer の開発🔗


画像を表示するのに愛用しているフリーソフトがあります。MassiGraというアプリですが。残念ながら10年以上更新されていません。仕方がないので自分で同じような操作感のViewrを作ることにしました。


最近のWindowsネイティブ開発はさっぱり行っておらず、最後に作ったのはそこそこ前に作ったWPFの並列動画再生ソフトでした。現在の最新のライブライはWinUI 3のようだったので、それを使って開発を始めました。


作成したもの🔗



動作画面🔗


素材フリーで使えるデータで思いついたのがこれ。途中で2分割と4分割に切り替えています。PDFは縦スクロールよりも見開きページ切り替えのほうが見やすいと感じました。


{"width":"1934px","height":"1336px"}


開発時の要件🔗


  • MassiGra のように高速起動かつ
  • 画面にごちゃごちゃ余計なものを載せない
  • 起動時のスプラッシュスクリーンなど論外
  • キーボードでサクサク画像を切り替えられる
  • 見開き漫画モード対応


WinUI 3 に関して🔗


WinUI 3は、マイクロソフトが提供するWindowsアプリケーション開発用のUIフレームワークです。WPFの進化版だと思って触ったら、初っ端から手痛い洗礼を受けました。GUIのコンポーネント配置機能がありません。xamlをテキストで記述してレイアウトやコンポーネントの配置を決める構造です。一から始めるのには敷居がチョモランマです。もはやAIを召喚するしかありません。


画像表示🔗


画像を読み込んで表示するだけなら簡単です。ただ、アニメーションWebPなどに対応するには標準機能では対応できないのでGoogleの提供するグラフィックライブラリのSkiaSharpを導入しました。Skiaに関してはHTMLをイメージに変換するSatoruや画像変換ライブラリのwasm-image-optimizationで利用したことがあります。今回はC#からまたお世話になりました。


画像編集🔗


明るさや色調補正、切り抜きなどに対応させました。MassiGra に編集機能がついていたので実装していますが、私はあまり必要性を感じてません。


動画の読み込み🔗


アニメーション画像に対応したところで、いっそ動画も表示できるようにしようと思い立ちました。標準コンポーネントでも動画再生は可能なのですが、FFmpegInteropXを導入して、対応フォーマットを増やすことにしました。


動画再生自体はそれほど難しくはないのですが、並列で動画を再生し、それを高速で切り替えたらアプリどころかGPUがハングアップする事態が頻発しました。高速化のためにUIと画像のデコードがそれぞれマルチスレッド化しておりそれが仇になりました。WinUI 3はDirect3D12ベースで動くのですが、どうやら動画絡みの処理でGPUリソースをぶっ壊している状態になっているらしく、かなり不安定でした。最終的にMediaPlayerElementを使い回さないようにしたら安定しました。


この時点で画像Viewerを作っていたはずなのに、マルチメディアViwerと化しました。


アーカイブのサポート🔗


圧縮されているファイルの中の画像も、仮想フォルダ扱いにして画像を表示できるようにしました。


PDFのサポート🔗


PDFもアーカイブファイルに近い構造で画像扱いできるようにしました。PDFはページごとに画像として扱っています。


構造図🔗


flowchart TD
    subgraph Input [入力ソース]
        A[画像ファイル]
        B[動画ファイル]
        C[アーカイブ ZIP/RAR/7z]
        D[PDFドキュメント]
    end

    subgraph Logic [制御・管理]
        E{PlaylistManager}
        F[ViewerCacheManager]
        G[仮想フォルダ展開]
    end

    subgraph Rendering [レンダリングエンジン]
        H[SkiaSharp]
        I[FFmpegInteropX]
        J[Windows.Data.Pdf]
    end

    subgraph UI [ユーザーインターフェース]
        K[WinUI 3 Main Window]
        L[単一表示]
        M[漫画モード / 4分割]
        N[グリッド表示]
    end

    A & B --> E
    C & D --> G --> E
    E --> F

    F -- 静止画/アニメーション --> H
    E -- 動画再生 --> I
    G -- PDFページ展開 --> J --> H

    H & I --> K
    K --> L & M & N

    subgraph Interactions [ユーザー操作]
        O[キーボード / マウス] --> K
        K --> P[画像編集 / 色調補正]
    end


現時点での対応フォーマット🔗


カテゴリ対応フォーマット
画像.jpg, .jpeg, .png, .bmp, .gif, .webp, .avif, .heic, .heif, .jxl, .tif, .tiff, .svg, .ico, .tga, .pcx
RAW 画像.dng, .nef, .cr2, .arw
動画.mp4, .mkv, .mov, .avi, .wmv, .flv, .webm, .avis
圧縮ファイル.zip, .cbz, .rar, .cbr, .7z
その他.pdf, .psd


その他🔗


スライドショーや画像一覧表示用のグリッドモードなどを付けました。また、ブックマーク機能もあります。ブックマーク機能は開発時のテストで地味に役に立ちました。


ストアへの公開🔗


WinUI 3のアプリは、VisualStudioから公開用パッケージがストレートに作成できるので、あとはそれをストアにアップロードして各種情報を登録すればリリースできます。


注意点として、WinUI 3の権限を過剰に要求すると登録がリジェクトされます。今回のアプリはただのデスクトップアプリなので、ファイルアクセスなどは通常のAPIを使って行うことが可能です。逆にWinUI 3専用のファイルアクセス機能を使いその権限を要求すると、同じことをしているだけなのに何故かリジェクト対象となります。


まとめ🔗


いつもはWeb開発ばかりなのですが、久々にネイティブアプリを作りました。感想としてはUIの作成は慣れているWebの方が圧倒的に作りやすかったというところです。