前回はファイルの保存をやりました。今回は読み込みをやることにします。
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 { private void buttonOpenFile_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "アイコン|*.ico"; if(dlg.ShowDialog() != DialogResult.OK) return; Icon icon = new Icon(dlg.FileName, new Size(32, 32)); Bitmap bitmap = icon.ToBitmap(); for(int row = 0; row < 32; row++) { for(int colum = 0; colum < 32; colum++) { panels[colum, row].BackColor = bitmap.GetPixel(colum, row); } } icon.Dispose(); bitmap.Dispose(); } } |
これで完成!と思っていたら32×32ピクセルのアイコンでない場合、例外が発生してしまいます。
1 |
Icon icon = new Icon(dlg.FileName, new Size(32, 32)); |
これは指定したファイルから指定したサイズで Icon クラスの新しいインスタンスを初期化するというものですが、指定したサイズと同じものがない場合はサイズが最も近いアイコンが返されます。
ということは、32×32ピクセルのアイコンが存在しない場合、うまくいきません。もっとも普通は32×32ピクセルのアイコンは存在するはずです。そのためミスに気づけなかった。orz
32×32ピクセルのアイコンがない場合は、Graphics.DrawImage メソッドを使って、32×32ピクセルのアイコンをつくる必要があります。
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 |
public partial class Form1 : Form { private void buttonOpenFile_Click(object sender, EventArgs e) { Icon icon = new Icon(dlg.FileName, new Size(32, 32)); // 32×32ピクセルのアイコンが見つからなかった場合 if(icon.Width != 32 || icon.Height != 32) { Image image = Image.FromFile(dlg.FileName); Bitmap bmp = new Bitmap(32, 32); Graphics g = Graphics.FromImage(bmp); g.DrawImage(image, new Rectangle(0, 0, 32, 32)); icon = Icon.FromHandle(bmp.GetHicon()); bmp.Dispose(); g.Dispose(); image.Dispose(); } Bitmap bitmap = icon.ToBitmap(); for(int row = 0; row < 32; row++) { for(int colum = 0; colum < 32; colum++) { panels[colum, row].BackColor = bitmap.GetPixel(colum, row); } } icon.Dispose(); bitmap.Dispose(); } } |
これだけでは面白くないので、他のイメージファイルも読み込めるようにしてしまいましょう。画像ファイルからアイコンを作ることができるようになります。
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
public partial class Form1 : Form { private void buttonOpenFile_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "アイコン|*.ico|ビットマップ|*.bmp|JPG|*.jpg|PNG|*.png|すべてのファイル|*.*"; if(dlg.ShowDialog() != DialogResult.OK) return; // *.ico if(dlg.FilterIndex == 1) { Icon icon = new Icon(dlg.FileName, new Size(32, 32)); // 32×32ピクセルのアイコンが見つからなかった場合 if(icon.Width != 32 || icon.Height != 32) { Image image = Image.FromFile(dlg.FileName); Bitmap bmp = new Bitmap(32, 32); Graphics g = Graphics.FromImage(bmp); g.DrawImage(image, new Rectangle(0, 0, 32, 32)); icon = Icon.FromHandle(bmp.GetHicon()); bmp.Dispose(); g.Dispose(); image.Dispose(); } Bitmap bitmap = icon.ToBitmap(); for(int row = 0; row < 32; row++) { for(int colum = 0; colum < 32; colum++) { panels[colum, row].BackColor = bitmap.GetPixel(colum, row); } } icon.Dispose(); bitmap.Dispose(); } // *.bmp,*.jpg,*.png if(dlg.FilterIndex == 2 || dlg.FilterIndex == 3 || dlg.FilterIndex == 4) { Bitmap bitmap1 = new Bitmap(dlg.FileName); Bitmap bitmap2 = new Bitmap(32, 32); Graphics g = Graphics.FromImage(bitmap2); g.DrawImage(bitmap1, new Rectangle(0, 0, 32, 32)); for(int row = 0; row < 32; row++) { for(int colum = 0; colum < 32; colum++) { panels[colum, row].BackColor = bitmap2.GetPixel(colum, row); } } g.Dispose(); bitmap1.Dispose(); bitmap2.Dispose(); return; } // すべてのファイル if(dlg.FilterIndex == 5) { try { using(Image img = Image.FromFile(dlg.FileName)) using(Bitmap bitmap = new Bitmap(32, 32)) { Graphics g = Graphics.FromImage(bitmap); g.DrawImage(img, new Rectangle(0, 0, 32, 32)); for(int row = 0; row < 32; row++) { for(int colum = 0; colum < 32; colum++) { panels[colum, row].BackColor = bitmap.GetPixel(colum, row); } } } } catch { MessageBox.Show("これは画像ファイルではありません", "", MessageBoxButtons.OK, MessageBoxIcon.Error); } return; } } } |
この画像をアイコン化できるかやってみました。
実行結果。
保存してみるとアイコンファイルも正常に作成されていることが確認できました。