経緯
デジカメで撮った画像をExcelに貼り付けようとするときに、1枚5MBもあって
Excelファイルが重くなってました。
ペイントアプリでリサイズすることは可能ですが、めんどくさいので、
今回,C#でWindowsアプリを作ってみました。
レイアウト
まず、アプリのレイアウトを書きます。
| ツール名 | Text名 | (Name) |
| label | 画像のパス: | label1 |
| label | 保存先のパス: | label2 |
| TextBox | textBox_picture_path | |
| TextBox | textBox_save_path | |
| Button | 選択 | button_picture_path |
| Button | 選択 | button_chose_save_path |
| Button | 実行 | button_run |
という構成です。配置は(Name)で表すと
label1,textBox_picture_path,button_picture_path
label2,textBox_save_path,button_chose_save_path
button_run
という並びとなります。
コード
以下がコードです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace デジカメの画像の容量を小さくする
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox_picture_path.Text = "ドラッグ&ドロップしてください";
// ドラッグ&ドロップを有効化
textBox_picture_path.AllowDrop = true;
textBox_picture_path.DragEnter += (sender, e) => e.Effect = DragDropEffects.Copy;
textBox_picture_path.DragDrop += (sender, e) =>
{
var files = e.Data.GetData(DataFormats.FileDrop) as string[];
if (files != null && files.Length > 0)
{
textBox_picture_path.Text = files[0];
}
};
}
private void textBox_picture_path_TextChanged(object sender, EventArgs e)
{
}
private void textBox_save_path_TextChanged(object sender, EventArgs e)
{
}
private void button_run_Click(object sender, EventArgs e)
{
string directoryPath = textBox_picture_path.Text;
if (Directory.Exists(directoryPath))
{
// 保存先フォルダ内に新しいフォルダを作成
string newFolder = Path.Combine(textBox_save_path.Text, "ResizedImages");
Directory.CreateDirectory(newFolder); // フォルダが存在しない場合は作成
// フォルダ内のすべての画像ファイルを取得
var imageFiles = Directory.EnumerateFiles(directoryPath, "*.*", SearchOption.TopDirectoryOnly)
.Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
s.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase));
foreach (var filePath in imageFiles)
{
try
{
string fileName = Path.GetFileName(filePath); // 元のファイル名を保持
string savePath = Path.Combine(newFolder, fileName); // 新しいフォルダ内の保存先パスを構築
ResizeImage(filePath, savePath, 800, 600); // 画像をリサイズして保存
}
catch (Exception ex)
{
MessageBox.Show($"エラーが発生しました: {ex.Message}", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; // エラーが発生した場合は処理を中断
}
}
MessageBox.Show("全ての画像がリサイズされて保存されました。", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("指定されたパスは有効なフォルダではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
public void ResizeImage(string originalFile, string resizedFile, int width, int height)
{
using (Image originalImage = Image.FromFile(originalFile))
{
using (Bitmap resizedBitmap = new Bitmap(width, height))
{
using (Graphics graphics = Graphics.FromImage(resizedBitmap))
{
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.DrawImage(originalImage, 0, 0, width, height);
// リサイズされた画像の保存
resizedBitmap.Save(resizedFile, ImageFormat.Jpeg); // JPEG形式で保存
}
}
}
}
private void button_chose_save_path_Click(object sender, EventArgs e)
{
using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
{
// ダイアログの説明テキストを設定
folderBrowserDialog.Description = "画像を保存するフォルダを選択してください。";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
// 選択されたフォルダのパスをテキストボックスに設定
textBox_save_path.Text = folderBrowserDialog.SelectedPath;
}
}
}
private void button_picture_path_Click(object sender, EventArgs e)
{
using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
{
folderBrowserDialog.Description = "画像ファイルが格納されているフォルダを選択してください。";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
textBox_picture_path.Text = folderBrowserDialog.SelectedPath; // パスを設定
}
}
}
private void textBox_picture_path_Enter(object sender, EventArgs e)
{
if (textBox_picture_path.Text == "ドラッグ&ドロップしてください")
{
textBox_picture_path.Text = ""; // テキストをクリア
}
}
private void textBox_picture_path_Leave(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(textBox_picture_path.Text))
{
textBox_picture_path.Text = "ドラッグ&ドロップしてください"; // 初期テキストを再表示
}
}
}
}
使い方は、
まず、textBox_picture_pathにドラックドロップか「選択」ボタンを押して、リサイズしたい画像が入っているフォルダを選択してください。
次にtextBox_save_pathにリサイズし終えた画像のフォルダを保存したい場所を「選択」ボタンを押して、設定してください。
最後に「実行」を押すと、リサイズされた画像フォルダが指定された先「ResizedImages」という名前で保存されてます。
こんな感じです。
何かの参考になれば、幸いです。
ここまで読んでいただきありがとうございました。
技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。
気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。
