【C#】WindowsAPICodePackで、各種ファイルのサムネイルを表示してみる。

C#,開発

おはようございます。

Windowsフォームに画像を表示するのに、
画像ファイルであれば特に何も考えずに表示できますが、
それ以外のファイルでサムネイルを表示する方法を試してみました。

プログラムは新規で、新たにプロジェクトを作成します。

スポンサーリンク

新規プロジェクトの作成

VisualStudio2017で新しく WindowsForm プロジェクトを作成します。
今回は「SampleThumbnailView」としました。

画面の作成

画面

画面にラベル、テキストボックス、ボタン、ピクチャーボックスを並べます。

パッケージの追加

ファイルからサムネイルを作るために、別途パッケージをインストールします。

パッケージの追加

ソリューションエクスプローラーで、「参照」を右クリック>「NuGetパッケージの管理」メニューを選択します。

NuGetパッケージ管理

WindowsAPICodePackを入力、表示された「Microsoft-WindowsAPICodePack-Shell」をインストールします。

変更のプレビュー

変更のプレビューが表示される場合は「OK」ボタンをクリックします。

プログラム

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


using System.IO;
using Microsoft.WindowsAPICodePack.Shell;

namespace SampleThumbnailView
{
    /// <summary>
    /// メイン画面
    /// </summary>
    public partial class Form1 : Form
    {
        /// <summary>
        /// 画面表示時の処理
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 参照ボタンクリックイベント.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_ref_Click(object sender, EventArgs e)
        {

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            ofd.Filter = "すべてのファイル(*.*)|*.*";
            ofd.FilterIndex = 2;
            ofd.Title = "開くファイルを選択してください";
            ofd.RestoreDirectory = true;
            ofd.CheckFileExists = true;
            ofd.CheckPathExists = true;

            //ダイアログを表示する
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //OKボタンがクリックされたとき、選択されたファイル名を表示する
                txb_file.Text = ofd.FileName;
            }
        }

        /// <summary>
        /// 表示ボタンクリックイベント.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_read_Click(object sender, EventArgs e)
        {
            pcb_preview.Image = CreateThumbnail(txb_file.Text, 1);
        }

        /// <summary>
        /// サムネイル画像を生成します.
        /// </summary>
        /// <param name="path"></param>
        /// <param name="scale"></param>
        /// <returns></returns>
        private Bitmap CreateThumbnail(string path, int scale)
        {
            // ファイルが存在した場合
            FileInfo fi = new FileInfo(path);
            if (fi.Exists)
            {
                ShellFile shellFile = ShellFile.FromFilePath(path);
                Bitmap bmp = shellFile.Thumbnail.Bitmap;
                int w = (int)(bmp.Width * scale);
                int h = (int)(bmp.Height * scale);
                return bmp;
            }

            // ファイルが存在しない場合はデフォルト表示
            return SampleThumbnailView.Properties.Resources.Message;
        }

    }
}

起動してみる

初期表示

初期表示、「参照」ボタンをクリックします。

ファイル選択ダイアログ

今回は試しに Json ファイルを指定してみます。

サムネイル表示

サムネイルが表示されました。

存在しないファイルを指定

存在しないファイルを指定した場合

エラー表示

デフォルトの画像を表示(エラー)するようにしてみました。

まとめ

単発のネタです。(多分)
あまり利用シーンは少ないかもしれませんが、何かのお役に立てれば。

ではでは。

ソースはこちら。

GitHub

スポンサーリンク


関連するコンテンツ