2019-09-02に投稿

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

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

Originally published at www.doraxdora.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント