single.php

C# WinUI3で画像ファイルの縦横比を取得する方法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで画像ファイルをImageコントロールなどに読み込ませずに縦横比を取得する方法です。

コントロールの[ActualHeight]は使えない

WinUI3では画像のサイズを取得するには、Xamlに追加した[Image]コントロールに読み込ませて([Source]プロパティ)[ActualHeight]などで取得ができます。

WinFormの時代は、Drawing.ImageのWidth/Heightで簡単に取得できてました。

string filepath = "C:\hogehoge.png";
fs = New System.IO.FileStream(filepath, IO.FileMode.Open, IO.FileAccess.Read)
imagew = System.Drawing.Image.FromStream(fs).Width
imageh = System.Drawing.Image.FromStream(fs).Height
fs.Close()

WinUI3では、System.Drawing.Image アセンブリが無いので、どうしたものかと探していた所、Windows.Storage.StorageFileの[GetThumbnailAsync]で縦横比であれば簡単に取得ができました。

画像の寸法は取得できませんが、縦横比だけでも分かればレイアウト作業は楽になります。

サムネイルから縦横比を取得

具体的には次のコードで画像の縦横比が取得できます。

[GetThumbnailAsync]メソッドの第1引数が[ThumbnailMode.SingleItem]の時だけ、取得できるサムネイル画像の縦横比が、対象ファイルに合わせて取得されるのを利用しています。(他の[ThumbnailMode]の場合は縦横が同じ)

private async Task<double> GetImageHeight(string path, double width)
{
  double height = 0;
  Windows.Storage.StorageFile file = await Windows.Storage.StorageFile.GetFileFromPathAsync(path);
  StorageItemThumbnail? thumbnail = await file.GetThumbnailAsync(ThumbnailMode.SingleItem, (uint)width);
  height = (thumbnail.OriginalHeight * width) / thumbnail.OriginalWidth;
  return Height;
}

実行すると、引数[width]で指定した数値との縦横比が取得できます。

まとめ

今回は短い記事ですが、WinUI3プロジェクトで画像ファイルをImageコントロールなどに読み込ませずに縦横比を取得する方法について紹介しました。

裏技的な方法ですが、[StorageFile]クラスの[GetThumbnailAsync]メソッドの第1引数が[ThumbnailMode.SingleItem]の時だけ、取得できるサムネイル画像のサイズから縦横比が算出できます。

WinUI 3で、画像ファイルの縦横比を取得したい人の参考になれば幸いです。

スポンサーリンク

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

コメントを残す

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