前回は画像の色を一括置換するアプリを作成しましたが、今回は画像を分割するアプリを作成します。
この画像を
このように分割します。
デザイナで以下のようなものを作成します。
[ファイルを選択]がクリックされたら画像ファイルが選択された場合は縦横を指定された数で分割します。分割されたファイルはそのファイルがあったフォルダ内にoutputという名前のフォルダを作成して、(元のファイル名)_x○_y○という名前で保存します。
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(); } private void button1_Click(object sender, EventArgs e) { if(numericUpDown1.Value == 0 || numericUpDown2.Value == 0) { MessageBox.Show("分割する値を設定してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } OpenFileDialog dialog = new OpenFileDialog(); if(dialog.ShowDialog() == DialogResult.OK) { string filePath = dialog.FileName; SplitImage(filePath, (int)numericUpDown2.Value, (int)numericUpDown1.Value); } } } |
ファイルが選択されたらSplitImageメソッドで画像を分割します。
そのまえに本当に選択されているファイルが画像ファイルかどうか確認する必要があります。Image.FromFileメソッドを実行して例外が発生しなければ画像ファイルであると判断することができます。
出力先フォルダがなければ作成します。
ファイルパスからフォルダのパスと画像ファイルの名前を取得する必要があるのでFileInfoクラスを使用しています。ファイル名から拡張子を取り除いたファイル名を取得して、そのあとに分割されたファイルのどの部分なのかがわかるように_x○_y○をつけます。
あとは画像ファイルから必要な部分をトリミングしてファイルとして保存しています。
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 |
public partial class Form1 : Form { void SplitImage(string filepath, int colum, int row) { Image image; try { image = Image.FromFile(filepath); } catch { MessageBox.Show("これは画像ファイルではありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } System.IO.FileInfo info = new System.IO.FileInfo(filepath); string folderPath = info.DirectoryName; string outputFolderPath = folderPath + "\\output"; if(!System.IO.Directory.Exists(outputFolderPath)) System.IO.Directory.CreateDirectory(outputFolderPath); string fileName = info.Name; string extension = info.Extension; int a = fileName.LastIndexOf("."); string filename; if(a != -1) { // 拡張子を除くファイルの名前を取得する filename = fileName.Substring(0, a); } else { filename = fileName; } int width = image.Width; int height = image.Height; int width1 = width / colum; int height1 = height / row; for(int x = 0; x < colum; x++) { for(int y = 0; y < row; y++) { Bitmap bmp = new Bitmap(width1, height1); Graphics g = Graphics.FromImage(bmp); g.DrawImage(image, new Rectangle(0, 0, width1, height1), new Rectangle(width1*x, height1*y, width1, height1), GraphicsUnit.Pixel); g.Dispose(); string outputFilePath = String.Format("{0}\\{1}_X{2}_Y{3}{4}", outputFolderPath, filename, x, y, extension); bmp.Save(outputFilePath); bmp.Dispose(); } } image.Dispose(); } } |