前回はサイズ変更できる範囲に縛りがありましたが、今回はユーザーが自由な値を設定することができるようにしました。
一律縦横の比を指定した倍率で縮小
横幅が指定した値を超えていたら縮小
高さが指定した値を超えていたら縮小
という3つのオプションのなかから選べるようにしました。
コンストラクタ内で各コントロールの初期値を設定します。それからラジオボタンが選択されたときの処理(他のコントロールの有効無効を切り替える)ができるようにイベントハンドラを追加しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.AllowDrop = true; this.DragOver += Form1_DragOver; this.DragDrop += Form1_DragDrop; numericUpDown1.Minimum = 1; numericUpDown1.Maximum = 100; numericUpDown1.Value = 50; numericUpDown2.Minimum = 1; numericUpDown2.Maximum = 10000; numericUpDown2.Value = 500; radioButton1.CheckedChanged += RadioButton1_CheckedChanged; radioButton2.CheckedChanged += RadioButton1_CheckedChanged; radioButton3.CheckedChanged += RadioButton1_CheckedChanged; } } |
ラジオボタンのチェック状態が変化したら、一番上がチェックされているときは上側のNumericUpDownコントロールのみ、下側のふたつがチェックされているときは下側のNumericUpDownコントロールのみ有効にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public partial class Form1 : Form { private void RadioButton1_CheckedChanged(object sender, EventArgs e) { if(radioButton1.Checked) { numericUpDown1.Enabled = true; numericUpDown2.Enabled = false; } else { numericUpDown1.Enabled = false; numericUpDown2.Enabled = true; } } } |
フォーム上にドラッグされているときの処理です。これは前回と変わりません。
1 2 3 4 5 6 7 8 9 10 |
public partial class Form1 : Form { private void Form1_DragOver(object sender, DragEventArgs e) { if(e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.All; } } } |
フォーム上にドロップされたときの処理です。
どのラジオボタンがチェックされているかを調べて、適切な処理をおこないます。まずファイルがドロップされたときにそれぞれのファイルが画像ファイルかどうか調べます。
画像ファイルであれば、「一律縦横の比を指定した倍率で縮小」であればnumericUpDown1.Valueの値を調べて縮小処理をすることで得られるBitmapを取得します。「横幅が指定した値を超えていたら縮小」「高さが指定した値を超えていたら縮小」のときは幅・高さを変更することで得られるBitmapを取得します。そのあとこれをファイルとして保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
using System.Drawing.Imaging; public partial class Form1 : Form { private void Form1_DragDrop(object sender, DragEventArgs e) { if(e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); foreach(string filePath in files) { Bitmap orgBitmap = GetBitmapIfImageFile(filePath); if(orgBitmap == null) { orgBitmap.Dispose(); continue; } string newFilePath = GetSaveFilePath(filePath); string ext = GetFileExtension(filePath); Bitmap newBitmap = null; if(radioButton1.Checked) { double magni= (int)numericUpDown1.Value / 100d; newBitmap = GetBitmapMagnification(orgBitmap, magni); } else if(radioButton2.Checked) { int maxWidth = (int)numericUpDown2.Value; newBitmap = GetBitmapFromWidth(orgBitmap, maxWidth); } else if(radioButton3.Checked) { int maxHeight = (int)numericUpDown2.Value; newBitmap = GetBitmapFromHeight(orgBitmap, maxHeight); } else { orgBitmap.Dispose(); continue; } if(ext.ToLower() == ".png") newBitmap.Save(newFilePath, ImageFormat.Png); else if(ext.ToLower() == ".bmp") newBitmap.Save(newFilePath, ImageFormat.Bmp); else if(ext.ToLower() == ".gif") newBitmap.Save(newFilePath, ImageFormat.Gif); else if(ext.ToLower() == ".jpg") newBitmap.Save(newFilePath, ImageFormat.Jpeg); else if(ext.ToLower() == ".Tiff") newBitmap.Save(newFilePath, ImageFormat.Tiff); else newBitmap.Save(newFilePath); orgBitmap.Dispose(); newBitmap.Dispose(); } } } } |
GetBitmapMagnification(Bitmap orgBitmap, double magnification)は、第一引数のBitmapを指定された倍率で縮小(拡大)したあとのBitmapを取得するメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { Bitmap GetBitmapMagnification(Bitmap orgBitmap, double magnification) { if(orgBitmap == null) return null; int width = orgBitmap.Width; int height = orgBitmap.Height; int newWidth = (int)(width * magnification); int newHeight = (int)(height * magnification); Bitmap newBitmap = new Bitmap(newWidth, newHeight); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(orgBitmap, new Rectangle(0, 0, newWidth, newHeight)); g.Dispose(); return newBitmap; } } |
GetBitmapFromWidth(Bitmap orgBitmap, int maxWidth)は、第一引数のBitmapの幅が指定された幅よりも広い場合、これを縮小処理したあとのBitmapを取得するメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public partial class Form1 : Form { Bitmap GetBitmapFromWidth(Bitmap orgBitmap, int maxWidth) { // 横幅を調べる int width = orgBitmap.Width; int height = orgBitmap.Height; int newWidth = width; int newHeight = height; // 指定された幅よりも広い場合 if(width > maxWidth) { newWidth = maxWidth; double div = (double)maxWidth / width; newHeight = (int)(height * div); } Bitmap newBitmap = new Bitmap(newWidth, newHeight); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(orgBitmap, new Rectangle(0, 0, newWidth, newHeight)); g.Dispose(); return newBitmap; } } |
GetBitmapFromHeight(Bitmap orgBitmap, int maxHeight)は、第一引数のBitmapの幅が指定された高さも高い場合、これを縮小処理したあとのBitmapを取得するメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { Bitmap GetBitmapFromHeight(Bitmap orgBitmap, int maxHeight) { // 高さを調べる int width = orgBitmap.Width; int height = orgBitmap.Height; int newWidth = width; int newHeight = height; if(height > maxHeight) { newHeight = maxHeight; double div = (double)maxHeight / height; newWidth = (int)(width * div); } Bitmap newBitmap = new Bitmap(newWidth, newHeight); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(orgBitmap, new Rectangle(0, 0, newWidth, newHeight)); g.Dispose(); return newBitmap; } } |