画像ファイルのなかにはサイズが大きなものがあります。その画像ファイルの重要性が高画質であることであれば画像ファイルのサイズが多少大きくなることは仕方がないことなのかもしれません。

しかしその画像が単なる情報(たとえば領収書を写真にとったもの)であればどうでしょうか? 高画質である必要はありません。目的を達成できる画質をキープしているのであれば、サイズ的にも小さいほうがよいと考えられます。しかもこの画像をメールで他の人に送信するのであればなおさらです。

そこで今回は複数の画像を同時に変更するアプリを作成します。ひとつひとつ画像の大きさを手作業で変更しているようではいくら時間がかかるかわかりません。こういうことはコンピュータにやらせてしまいましょう。

複数の画像ファイルを選択して(もちろん一個でもよい)、フォームにドロップすれば出力用のフォルダのなかにサイズダウンした画像ファイルを保存します。

画像は一律サイズを50%にするとか、縦横の比を崩さず幅を500ピクセルにするといった要望にも応えられるアプリを作成します。

ではデザイナで以下のようなフォームを作成してみましょう。

最初は「画像は一律サイズを50%」にすることを考えます。

まずドロップされたファイルは画像ファイルなのかどうかを確かめる必要があります。
GetBitmapIfImageFile(string filePath)メソッドは画像ファイルであればBitmapを返します。そうでない場合はnullを返します。

画像ファイルであれば画像の縦横を半分にします。

新しく作成されたファイルは元のファイルと同じフォルダ内にoututというフォルダを作成して、そこにファイル名は変えずに保存するすることにします。このときのファイルパスを求めるのがGetSaveFilePath(string filePath)メソッドです。

FileInfoクラスを使えば元のファイルが存在するフォルダはわかります。そこで

これでよいと早合点。実際にテストしてみるとうまくいきません。処理をする前はOutputフォルダは存在しないので例外が発生していたのです。ファイルを保存するときは保存先のフォルダが存在することを確認しなければなりません。ない場合は作成すること。こういうケアレスミスには気をつけましょう。

一応これで完成です。

次に機械的に50%に縮小してしまうと小さい画像ファイルは小さくなりすぎてしまいます。そこで横は500ピクセル以下の場合はなにもしない、縮小するときは縦横比を崩さないように横は500ピクセルにするような処理をしたくなることもあると思います。そんなときはどうすればいいのでしょうか?