C# 画像ファイル変換ツールをプログラミングしてみた

C# ソフトウェア プログラミング

画像ファイル変換ツールできました!

初めに、変換対象の拡張子、変換後の拡張子、対象フォルダを指定します。

画像を変換するをクリックすると実行されます。

実行されると対象フォルダ内に変換された画像が作成されます。

すでに拡張子が同じ画像ファイルがあった場合にはスキップされます。

①実行前

実行前のD:\画像フォルダ

D:\画像

②実行後

実行後のD:\画像フォルダ

D:\画像

実行後、bmpからjpgに変換された画像ファイルが新規に作成されます。

プログラミング

言語:C#

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.Drawing.Imaging;
using System.Diagnostics;
using System.IO;
using System.Drawing.Drawing2D;

namespace 画像変換
{
    public partial class FrmImageConvert : Form
    {
        public FrmImageConvert()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 画面起動時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmImageConvert_Load(object sender, EventArgs e)
        {
            // チェックボックスのTAGに選択時の値をセットする(選択内容取得処理で使用する)
            chkFromBmp.Tag = "bmp";
            chkFromPng.Tag = "png";
            chkFromJpg.Tag = "jpg";
            chkFromTiff.Tag = "tiff";

            // ラジオボタンのTAGに選択時の値をセットする(選択内容取得処理で使用する)
            rdoToBmp.Tag = "bmp";
            rdoToPng.Tag = "png";
            rdoToJpg.Tag = "jpg";
            rdoToTiff.Tag = "tiff";
        }

        /// <summary>
        /// 画像を変換するクリック時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCconvert_Click(object sender, EventArgs e)
        {
            string sMsg = "";

            // 対象フォルダ選択で指定されたフォルダが存在するかチェックする
            if (!Directory.Exists(txtDir.Text))
            {
                // 存在しなければ警告を表示し、処理をする
                sMsg = "対象フォルダを選択して下さい。";
                MessageBox.Show(sMsg, "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;

            }

            // 確認メッセージを表示する
            sMsg = "画像変換を実行します。" + Environment.NewLine + "宜しいですか?";
            DialogResult result = MessageBox.Show(sMsg, "確認", MessageBoxButtons.OKCancel);
            if (result == DialogResult.Cancel)
            {
                // キャンセルなら処理を抜ける
                return;
            }

            // 変換対象の拡張子で選択された拡張子を取得する
            List<string> extensionsFromList = getSelectedCheck(ref panel1);
            if (extensionsFromList.Count <= 0)
            {
                // 何も選択されていなければ警告を表示し、処理をする
                sMsg = "変換対象の拡張子を選択して下さい。";
                MessageBox.Show(sMsg, "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;

            }

            // Log表示をクリアする
            txtLog.Clear();

            // 対象フォルダ選択で指定されたフォルダ配下のファイルを全て取得する
            string[] fileArray = System.IO.Directory.GetFiles(
                txtDir.Text, "*", System.IO.SearchOption.AllDirectories);

            // 指定された拡張子を持つファイルのみに絞り込む
            IEnumerable<string> targetFilesList =
                fileArray.Where(q => extensionsFromList.Any(x => q.ToLower().EndsWith(x)));

            // 変換後の拡張子でチェックされた拡張子を取得する
            ImageFormat imageFormat = null;
            string sExtensionTo = getSelectedCheck(ref panel2)[0];

            // 画像ファイル保存時に指定するイメージフォーマットをセットする
            switch (sExtensionTo)
            {
                case "bmp":
                    imageFormat = ImageFormat.Bmp;
                    break;
                case "png":
                    imageFormat = ImageFormat.Png;
                    break;
                case "jpg":
                    imageFormat = ImageFormat.Jpeg;
                    break;
                case "tiff":
                    imageFormat = ImageFormat.Tiff;
                    break;
            }

            // 絞り込まれた変換対象の画像ファイル分だけ処理する
            int iConvertCount = 0;
            foreach (string f in targetFilesList)
            {
                // イメージ格納変数を宣言する
                Image imageData = null;

                // 画像ファイルのパスを取得する
                string sPath = System.IO.Path.GetDirectoryName(f);

                // 画像ファイルのファイル名(拡張子を除く)を取得する
                string sFileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(f);

                // 変換後の保存先を組み立てる
                string saveFile = System.IO.Path.Combine(sPath, sFileNameWithoutExtension) + "." + sExtensionTo;

                // 保存先に同一ファイルが存在しないかチェックする
                if (System.IO.File.Exists(saveFile))
                {
                    // ファイルが存在していた場合には、LogにSKIPを表示する
                    txtLog.AppendText("【 SKIP 】 " + f + Environment.NewLine);

                    // 次の画像へSKIPする
                    continue;
                }

                try
                {
                    //画像ファイルを読み込む
                    imageData = Image.FromFile(f);

                    //画像ファイルをJPEGで保存する
                    imageData.Save(saveFile, imageFormat);

                    //
                    iConvertCount++;

                }
                catch (Exception)
                {
                    // 失敗
                    txtLog.AppendText("【  NG  】 " + f + Environment.NewLine);
                }
                finally
                {
                    // イメージを開放する
                    imageData.Dispose();
                }
            }

            // Logに変換された画像ファイル数と変換対象の画像数を表示する(最終行を表示するためフォーカスをセット)
            txtLog.Focus();
            txtLog.AppendText(String.Format("{0} / {1} の画像が変換されました。",
                              iConvertCount.ToString(),                 // 変換された画像ファイル数
                              targetFilesList.Count().ToString()));     // 変換対象の画像数


            // 変換完了メッセージを表示する
            sMsg = "画像ファイル変換が完了しました。";
            MessageBox.Show(sMsg, "完了", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        /// <summary>
        /// 対象フォルダ選択クリック時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDir_Click(object sender, EventArgs e)
        {
            // フォルダ選択ダイアログを表示する
            FolderBrowserDialog TargetFolder = new FolderBrowserDialog();
            TargetFolder.Description = "フォルダを指定して下さい。";
            if (TargetFolder.ShowDialog() == DialogResult.OK)
            {
                // 選択されたパスを対象フォルダ選択の入力欄にセットする
                txtDir.Text = TargetFolder.SelectedPath;
            }

        }

        /// <summary>
        /// 選択内容取得処理
        /// </summary>
        /// <param name="panel">パネル</param>
        /// <returns>選択リスト</returns>
        private List<string> getSelectedCheck(ref Panel panel)
        {
            // 選択リストを宣言する
            List<string> selectedList = new List<string>();

            // パネル上のコントロール分ループする
            foreach (Control c in panel.Controls)
            {
                if (c.GetType().Equals(typeof(CheckBox)))
                {
                    // チェックボックスの場合
                    CheckBox obj = c as CheckBox;
                    if (obj.Checked)
                    {
                        // 選択されているなら選択リストに格納する
                        selectedList.Add(obj.Tag.ToString());
                    }
                }
                else if (c.GetType().Equals(typeof(RadioButton)))
                {
                    // ラジオボタンのの場合
                    RadioButton obj = c as RadioButton;
                    if (obj.Checked)
                    {
                        // 選択されているなら選択リストに格納する
                        selectedList.Add(obj.Tag.ToString());
                    }
                }
            }
            // 選択
            return selectedList;
        }

        /// <summary>
        /// 終了クリック時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnEnd_Click(object sender, EventArgs e)
        {
            // 画面を閉じる
            this.Close();
        }
    }
}
       

コメント

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