経緯
デジカメで撮った画像を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」という名前で保存されてます。
こんな感じです。
何かの参考になれば、幸いです。
ここまで読んでいただきありがとうございました。
スクールの紹介
最後に宣伝をさせてください。
技術で未来を切り拓く―あなたの夢を現実にするプログラミングスクール
Webデザインやプログラミングで成功を目指している方々にとって、このオンラインスクールは夢を叶えるための最適な場所です。皆さんのキャリアを次の段階へと引き上げるためにデザインされたこのスクールは、一人ひとりの成功を心から願い、それを実現するための全てを提供しています。ここでは、このスクールの魅力について詳しくご紹介します。
◆圧倒的な費用対効果
このオンラインプログラミングスクールは、Web系教育において最高の費用対効果を提供しています。多くの高額スクールが存在する中で、ここではリーズナブルな価格で、質の高い教材、無限のサポート、そして実際に市場で求められるスキルの習得機会を提供しています。
◆現役フリーランスの講師陣
講師たちは全員、現役のフリーランスプロフェッショナルです。市場で活躍している講師から直接、最新のトレンドや実践的なスキルを学べるのは、このスクールの大きな特徴です。
◆柔軟な学習コース
固定のコースがなく、学習者の興味やニーズに応じて自由に学習できます。進路変更も自由で、最低契約期間は1ヶ月という柔軟性を持っています。自分のペースで、自分に合った学習が可能です。
◆無制限の添削とサポート
理解できるまで、そして満足するまで、無制限に添削と質問への回答を提供しています。進路相談や技術面以外の相談にも対応しており、全面的にサポートします。
◆社長から学べる貴重な機会
デザイナー、プログラマー、ディレクター、マーケターとして豊富な経験を持つ社長から直接学べるのも、このスクールの特別な点です。他のスクールでは得られない、貴重な機会です。
◆実績作りへの徹底的なサポート
就職、転職、フリーランスとして成功するためには、高品質な実績が必要です。生徒の作品レベルを最大限に高め、市場で求められる実績を作り上げることに力を入れています。案件を取得できない生徒には、直接案件を提供することもあります。
◆メッセージからの約束
高額な授業料を支払わせて結果を出せないスクールとは違い、物理的なサポートは提供できないかもしれませんが、継続的な努力を通じて最高の結果を出せるようにサポートします。一緒に不正なスクールを撲滅し、あなたの夢を実現しましょう。
このプログラミングスクールは、Webデザインやプログラミングでの成功を目指す方々に必要な全てを備えています。今こそ、このコミュニティに参加し、あなたのキャリアを加速させる時です。
詳しくはこちら↓