画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

05 | 2017/06 | 07
S M T W T F S
- - - - 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 -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【C++/CLI】モノクロ画像の上に線などを描画(サンプルプログラム付き)

モノクロ画像の上に線などを描画する方法をまとめました。

【目標】

  • モノクロ/カラー区別なく画像の上に描画できること
  • 高速に描画できること
  • 再描画すること

作成したサンプルプログラムはこんな感じ↓です。

モノクロ画像の上に描画
(サンプルプログラムの使い方)
各ボタンをクリックするとファイルを開くダイアログボックスが開きますので、ビットマップファイルを指定して下さい。
(ダウンロード)
Visual Studio 2008 Express Edition版
Visual Studio 2005 Express Edition版
(上記のリンクを右ボタンクリックし、対象をファイルに保存でダウンロードできます。)

準備
線の描画は条件を同じにするため、以下の関数を使い回しました。

  void DrawGraphics(Graphics^ g){
   //ギザギザ模様を画像の上に描画
   int i, j;
   //ギザギザの線の描画
   for (j = 0; j < 256; j+= 3){
        for (i = 0; i < 25; i++){
        g->DrawLine(Pens::Blue, i * 10, j, i * 10 + 5, j - 5);
        g->DrawLine(Pens::Blue, i * 10 + 5, j - 5, i * 10 + 10, j);
        }
    }
  }


よくあるサンプルプログラム  

  private: System::Void btnBitmap_Click(System::Object^  sender, System::EventArgs^  e) {
     //ビットマップファイルからBitmapクラスを作成し、ピクチャボックスへ渡す方法
     //モノクロ画像だとエラーになります。

     
     try{
        //描画時間計測用
        Diagnostics::Stopwatch^ sw = gcnew Diagnostics::Stopwatch;
     
        //ピクチャボックスの画像クリア
        pictureBox1->Image = nullptr;

        //画像ファイル名の取得
        String^ FileName = GetImageFilename(); //←オリジナル関数です
        //Bitmapクラスの作成
        Bitmap^ bmp = gcnew Bitmap(FileName);
        //PictureBoxへBitmapを表示する。
        pictureBox1->Image = bmp;
     
        //Graphicsクラスの作成
        //※モノクロ画像ファイルを開くと、ここでエラーになります。

        Graphics^ g = Graphics::FromImage(bmp);
        //画像の上にギザギザ模様の描画
        sw->Start();
        DrawGraphics(g);
        sw->Stop();
        //描画時間表示
        MessageBox::Show("描画時間 = " + sw->ElapsedMilliseconds.ToString() + " msec");

     }catch(Exception^ err){
        //エラーの表示
        MessageBox::Show(err->Message);
     }
    }


このプログラムではカラー画像では問題ないのですが、8ビットモノクロ画像ファイルを開くとFromImageメソッドでエラーとなります。

CreateGraphicsを使ってGraphicsクラスを作成する方法

  private: System::Void btnCreateGraphics_Click(System::Object^  sender, System::EventArgs^  e) {
     //CreateGraphicsを使ってGraphicsクラスを作成し描画する。
     //モノクロ画像の上にも描画できますが、描画時間がかなり遅くなります。
     //描画したギザギザ模様は再描画されません。

       
     try{
        //描画時間計測用
        Diagnostics::Stopwatch^ sw = gcnew Diagnostics::Stopwatch;

        //ピクチャボックスの画像クリア
        pictureBox1->Image = nullptr;

        //Graphicsクラスの作成(CreateGraphicsを使う)
        Graphics^ g = pictureBox1->CreateGraphics();
     
        //画像ファイル名の取得
        String^ FileName = GetImageFilename(); //←オリジナル関数です
        //Bitmapクラスの作成
        Bitmap^ bmp = gcnew Bitmap(FileName);
        //PictureBoxへBitmapを表示する。
        pictureBox1->Image = bmp;
        pictureBox1->Refresh();

        //画像の上にギザギザ模様の描画
        sw->Start();
        DrawGraphics(g);
        sw->Stop();
        //描画時間表示
        MessageBox::Show("描画時間 = " + sw->ElapsedMilliseconds.ToString() + " msec");

     }catch(Exception^ err){
        //エラーの表示
        MessageBox::Show(err->Message);
     }
    }


このプログラムでは、モノクロ画像ファイルを開いても、モノクロ画像の上に線を描画することができます。
ただし、遅い!!!
再描画もされません。 


PictureBoxと同じ大きさのBitmapクラスを作成し、ピクチャボックスのImageへ。画像データはDrawImageで描画

  private: System::Void btnDrawImage_Click(System::Object^  sender, System::EventArgs^  e) {
     //ピクチャボックス表示用と画像データ用と別のBitmapクラスを作成し、
     //ピクチャボックスにはDrawImageを使って画像を描画する。
     //モノクロ画像でも表示可能
     //再描画可能、CreateGraphicsを使うより高速

     try{
        //描画時間計測用
        Diagnostics::Stopwatch^ sw = gcnew Diagnostics::Stopwatch;

        //ピクチャボックスの画像クリア
        pictureBox1->Image = nullptr;

        //画像ファイル名の取得
        String^ FileName = GetImageFilename();  //←オリジナル関数です 
        //Bitmapクラスの作成
        Bitmap^ bmpFileImage = gcnew Bitmap(FileName);

        //PictureBoxの大きさを画像の大きさに合わせる
        pictureBox1->Width  = bmpFileImage->Width;
        pictureBox1->Height = bmpFileImage->Height;

        //PictureBoxと同じ大きさのBitmapクラスを作成する。
        Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
        //空のBitmapをPictureBoxのImageに指定する。
        pictureBox1->Image = bmpPicBox;
        //Graphicsクラスの作成(空のピクチャボックスからGraphicsを作成する)
        Graphics^ g = Graphics::FromImage(pictureBox1->Image); 
     
        //PictureBoxへBitmapを描画する。
        g->DrawImage(bmpFileImage, 0, 0);
        pictureBox1->Invalidate();

        //画像の上にギザギザ模様の描画
        sw->Start();
        DrawGraphics(g);
        sw->Stop();
        //描画時間表示
        MessageBox::Show("描画時間 = " + sw->ElapsedMilliseconds.ToString() + " msec");

     }catch(Exception^ err){
        //エラーの表示
        MessageBox::Show(err->Message);
     }
    }

最初にピクチャボックスと同じ大きさのBitmapクラスを作成し、ピクチャボックスのImageクラスへ渡す。ピクチャボックスのImageからFromImageメソッドでGraphicsクラスを作成。
このようにすると、モノクロ画像の上にも線を描画することができ、再描画も勝手にしてくれます。
しかも、CreateGraphicsを使ってGraphicsクラスを作成した場合よりも、描画速度は10倍くらい速くなります。


Loading...
スポンサーリンク

この記事に対するコメント

この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/39-04938761
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計