【C#】特定のフォルダ配下にある画像の解像度を取得する


この記事はプロモーションを含みます。

C#

C#で、特定のフォルダ配下にある画像の解像度を取得する方法を説明します。
また、実行しやすいようフォームアプリのツールとして作成しています。

ツールについて

本ツールについて簡単に説明します。
以下のように、画像ファイルがあるパスを入力し、ボタンをクリックすることで、
画像の解像度を取得することが出来ます。

ソースコード

以下が、本ツールのソースコードです。
.NET Framework 8.0 環境で実装しました。

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            // 画像が保存されているフォルダのパス
            string folderPath = textBox1.Text;

            // フォルダ内の全てのファイルを取得
            string[] allFiles = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories);

            // リッチテキストボックスをクリア
            richTextBox1.Clear();

            foreach (string imageFile in allFiles)
            {
                // ファイルが画像形式かどうかを確認
                if (IsImageFile(imageFile))
                {
                    // 非同期で画像の解像度を取得
                    await Task.Run(() =>
                    {
                        string output = GetImageResolution(imageFile);
                        AppendTextToRichTextBox(output);
                    });
                }
            }
        }

        // 画像ファイルかどうかを判定するメソッド
        private static bool IsImageFile(string filePath)
        {
            string[] imageExtensions = [ ".jpg", ".jpeg", ".png", ".bmp" ];
            string extension = Path.GetExtension(filePath).ToLower();
            return Array.Exists(imageExtensions, ext => ext == extension);
        }

        // 画像の解像度を取得するメソッド
        private static string GetImageResolution(string imageFile)
        {
            string output = "";
            try
            {
                using Image img = Image.FromFile(imageFile);
                output = $"ファイル:{imageFile}\n幅:{img.Width} px, 高さ:{img.Height} px\n";
            }
            catch(Exception)
            {
                output = $"ファイル:{imageFile}\n解像度を取得できません。\n";
            }
            return output;
        }

        // リッチテキストボックスに逐次的にテキストを追加するメソッド
        private void AppendTextToRichTextBox(string text)
        {
            // UIスレッドでリッチテキストボックスを更新
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke(new Action<string>(AppendTextToRichTextBox), text);
            }
            else
            {
                richTextBox1.AppendText(text);
                richTextBox1.ScrollToCaret();
            }
        }
    }
}

ソースコードについてですが、
39行目で取得する画像の拡張子を定義しています。
現在は、jpg, jpeg, png, bmp を設定しています。

また、拡張子が画像ファイルとなっていても認識出来ないファイルについては、
50行目の画像ファイルの読み込み処理でエラーとなります。
その場合、53行目の Exceptionでハンドリングされます。
Exceptionでハンドリングしていますが、正確には「OutOfMemoryException」が発生しています。
エラーハンドリングを細かく制御したい場合は参考にして頂ければと思います。

ソースコード(デザイン)

自動生成されるデザイン向けのソースコードについては割愛しています。
使用しているコントロールは、以下の3つです。

  • テキストボックス:パスの入力用
  • ボタン:処理の開始用
  • リッチテキストボックス:実行結果の出力用

コメント

タイトルとURLをコピーしました