Skip to main content.

Saturday, December 30, 2006

C#での画像ファイル操作基礎

MS Visual C# 2005 Express Editionでの画像操作の基礎です。System.Drawing名前空間以下の画像ファイルの読み書き等の画像を扱うクラスを利用したサンプルプログラムです。まずは第一段階としてBitmapクラスを利用して、画像ファイルを表示させてみました。

Bitmapクラスは、ビットマップファイルだけではなく、JPEG、GIF、PNG等の一般的な画像ファイルフォーマットをサポートしています。このBitmapクラスを利用することにより、従来に比べて簡単に画像ファイルを扱うことが出来ます。

実行画面


今回のサンプルプログラムでは、WEBから画像ファイルを取り込む処理と、ローカルファイルから取り込む処理があります。いずれの場合もBitmapクラスのオブジェクトを生成して、フォーム上のpictureboxに表示します。

表示は、pictureboxの描画イベントで、Graphicsクラスのオブジェクトを利用して表示しています。単純にpictureboxのimageプロパティに指定して表示させることも出来ますが、このGraphicsクラスのオブジェクトを利用して表示させる方法の方が応用がきくようです。

描画イベントハンドラの生成方法は、以下を参考にして下さい。pictureboxを選択して右クリック→プロパティ→イベント→表示でイベントハンドラを生成します。

イベントハンドラ


以下は、ローカルファイルからの読み込み処理です。画像ファイル名を指定して、表示させます。
        //
        //ファイルから読込み
        //
        private void buttonLocalFile_Click(object sender, EventArgs e)
        {
            //開くダイアログの表示
            OpenFileDialog dialog = new OpenFileDialog();

            dialog.FileName = "image.bmp";
            dialog.InitialDirectory = @"C:\";

            //ここでは、bmpとjpgとgifをフィルターに指定(他にもサポートされている形式あり)
            dialog.Filter = "ビットマップファイル(*.bmp)|*.bmp|" + 
                            "JPEGファイル(*.jpg)|*.jpg|" +
                            "GIFファイル(*.gif)|*.gif|" +
                            "すべてのファイル(*.*)|*.*";

            dialog.Title = "イメージファイルを選択してください";

            if (dialog.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            //ファイルから読み込む
            try
            {
                //砂時計
                Cursor.Current = Cursors.WaitCursor;

                //クリア
                if (bitmapImage != null)
                {
                    bitmapImage.Dispose();
                }

                //イメージファイルからBitmapオブジェクトを生成
                bitmapImage = new Bitmap(dialog.FileName);

                Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            //砂時計を戻す
            Cursor.Current = Cursors.Default;
        }

以下は、Webからの読込処理です。URLを指定して画像ファイルを表示します。
        //
        //Webから取り込み
        //
        private void buttonWeb_Click(object sender, EventArgs e)
        {
            try
            {
                //砂時計
                Cursor.Current = Cursors.WaitCursor;

                //クリア
                if (bitmapImage != null)
                {
                    bitmapImage.Dispose();
                }

                //読込み
                string url = urlText.Text;
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url);

                //Stremから生成
                bitmapImage = new Bitmap(stream);
                
                stream.Close();

                Refresh();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            //砂時計を戻す
            Cursor.Current = Cursors.Default;
        }

実際に表示する処理です。必要な場合は、サイズを縮小してpictureboxに表示させています。
        //
        //ピクチャーボックスの描画イベントハンドラ
        //
        private void pictureBox_Paint(object sender, PaintEventArgs e)
        {
            //イメージデータの表示
            if(bitmapImage != null)
            {
                float rate, rateW, rateH;

                //オリジナル画像サイズの表示
                string strSize = "オリジナル画像サイズ:" + bitmapImage.Width.ToString() +
                                "×" + bitmapImage.Height.ToString();
                labelSize.Text = strSize;               

                //ピクチャーボックスのサイズより大きい場合は、縦、横の長い方のサイズが
                //ピクチャーボックスに入るように縮小する割合を計算する
                rateW = ((float)bitmapImage.Width) / imgBoxWidth;
                rateH = ((float)bitmapImage.Height) / imgBoxHeight;

                if ((rateH > (float)1.0) || (rateW > (float)1.0))
                {
                    if (rateH > rateW)
                    {
                        rate = rateH;
                    }
                    else
                    {
                        rate = rateW;
                    }
                }
                else
                {
                    rate = (float)(1.0);
                }

                //ピクチャーボックスのサイズを画像に合わせる
                pictureBox.Width = (int)(bitmapImage.Width / rate);
                pictureBox.Height = (int)(bitmapImage.Height / rate);

                //Graphicsのオブジェクトで表示
                Graphics graphics = e.Graphics;
                graphics.DrawImage(bitmapImage, 0, 0, (bitmapImage.Width / rate), (bitmapImage.Height / rate));
            }
        }

プログラム全体は、以下のファイルをダウンロードしてご覧下さい。
プロジェクトファイル一式

続きの画像ファイルを保存する処理については、C#での画像ファイル操作基礎(その2)を参照して下さい。

Windowsプログラミング関連記事