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

プロフィール

Akira

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

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

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

09 | 2017/10 | 11
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 31 - - - -

趣味のブログ

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】画像の拡大縮小表示(高機能版)

画像の拡大縮小表示(簡易版)のページでは、簡単に画像の拡大縮小表示する方法を紹介しましたが、画像サイズが大きいときなど、不都合な場合があるのですが、その時にはDrawImageメソッドを使って画像を拡大縮小表示します。

Win32APIのStretchDIBits
関数に相当するのが、.NETではGraphicsクラスのDrawImageメソッドになります。
DrawImageメソッドには実に30個ものオーバーロードがあり、その分だけ高機能になっているのですが、詳細はMSDNに任せるとして、これまで慣れ親しんできたStretchDIBitsに近いメソッドを紹介します。

DrawImageの構文は以下の通り
void DrawImage (
    Image^ image,
    Rectangle destRect,
    Rectangle srcRect,
    GraphicsUnit srcUnit
)

image描画するImageオブジェクト
通常はBitmapオブジェクトを渡す
destRect描画先(ピクチャボックスなど)の描画領域
srcRect描画するImageオブジェクトの領域
srcUnitsrcRect パラメータで使用する単位を指定する GraphicsUnit 列挙体のメンバ
通常はGraphicsUnit::Pixelと指定すればOK

また、Win32APIのSetStretchBltModeのように伸縮モードを設定するには、.NETでは
GraphicsオブジェクトのInterpolationModeプロパティで設定します。

Default規定の補間モード
High高品質補間
Low低品質補間
NearestNeighbor最近傍補間
Bilinear双一次補間
Bicubic双三次補間
HighQualityBilinear高品質双一次補間
HighQualityBicubic高品質双三次補間


画像処理のプログラムでは画素の1つ1つが良くわかるNearestNeighborがオススメです。

ということで、画像を等倍で表示する場合は、srcRectとdestRectを同じサイズに指定します。

画像の拡大縮小(DrawImage)

画像を n倍に拡大する場合は、srcRectをdestRectの1/n倍のサイズに指定します。
画像の拡大縮小(DrawImage)

この処理のサンプルプログラムは以下に示しておきます。
ただし、エラー処理などはまるで無視しています。

 private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    
     //PictureBoxと同じ大きさのBitmapクラスを作成する。
     Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
     //空のBitmapをPictureBoxのImageに指定する。
     pictureBox1->Image = bmpPicBox;
     //Graphicsクラスの作成(空のピクチャボックスからGraphicsを作成する)
     Graphics^g = Graphics::FromImage(pictureBox1->Image);

     //伸縮モードをNearestNeighborに設定
     g->InterpolationMode = Drawing2D::InterpolationMode::NearestNeighbor;

     //描画するビットマップ
     Bitmap^ bmp = gcnew Bitmap("c:\\test.bmp");
     //画像の描画
     int DrawScale = 5;
     g->DrawImage(bmp,
      System::Drawing::Rectangle(0, 0, pictureBox1->Width, pictureBox1->Height),
      System::Drawing::Rectangle(140, 100, pictureBox1->Width / DrawScale, pictureBox1->Height / DrawScale),
      GraphicsUnit::Pixel);
        
    }


 実行画面
画像の拡大縮小(DrawImage)

DrawImageメソッドを使ったサンプルプログラムを下記ページにてまとめました。

  .NET(C++/CLI)による画像拡大縮小表示、画像処理サンプルプログラム


参考まで。


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

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

お忙しい中、ご回答いただき誠にありがとうございます。

http://imagingsolution.blog107.fc2.com/blog-entry-182.html
でご紹介いただいている方法です。
VC++2008,OpenCV2.0使用です。
なぜかバーのドラッグ中には再描画されません。。

ですので、下記を参考に、OpenCVのところを移植しました。
http://imagingsolution.blog107.fc2.com/blog-entry-95.html

■スクロールバーチェンジイベント内で、
 DrawImage→DrawLine→Refreshの順になるようにしております。
■カラーパレットはGraphicsを作成する時のみで、上記イベント内では
 作成していませんでした。
■this->SetStyle(ControlStyles::Opaque, true)を設定してみます。
■DrawImageでbitmapの一部分をpictureboxに描画し、
 その後、表示部分からどのような直線を描画するか判断して、
 描画しております。アドバイスいただいた内容から推測するに、
 ここの処理が重いのかと思われます。
 直接bitmapに直線を描画し、表示範囲を選択して、表示するようにできれば
 一番良さそうなのですが。
現在、環境が手元に無いため、明日再度ご報告させていただきます。
アドバイスいただき、本当にありがとうございます。
ご迷惑でなければ、ご確認宜しくお願いいたします。
【2011/02/06 17:38】 URL | color #- [ 編集]


コメント頂きありがとうございます。
まず、①の方法ですが、ここ
http://imagingsolution.blog107.fc2.com/blog-entry-182.html
で紹介している方法でしょうか?
この場合、私の環境ではスクロールバーの移動中でも再描画されていたので、もし違えば、この方法を試してみてください。とはいえ、この方法が最善とは言えないのですが...

また、画像の描画、直線の描画の方法ですが、
もし、DrawImage→Refresh→DrawLine→Refreshの順で処理しているのなら、DrawImage→DrawLine→Refreshの順になるように工夫してみて下さい。

この場合、画像データをIplIamgeからBitmapクラスへ渡していると思いますが、もし、再描画の度にカラーパレットを作っているのなら、Bitmapの宣言をフォームのメンバ変数(フィールド)へ持っていくなどして、再描画の時の処理をできるだけ軽くして下さい。

さらに、それでもチラつきが気になる場合は、Formのコンストラクタの部分(InitializeComponent()の下あたり)に
this->SetStyle(ControlStyles::Opaque, true);
と、追記して下さい。
この設定は、再描画時に背景の自動消去をしない設定なのですが、ここでは、うまく説明できないので、とりあえず設定してみて下さい。

それでもダメな場合のネタは、あと、もう一つ、無くはないのですが、まだ、私自身が評価しきれていないこともあるので、まずは、上記の方法をお試し下さい。
【2011/02/05 22:47】 URL | Akira #- [ 編集]


いつも大変参考にさせていただいております。
貴重な情報をありがとうございます。

一点質問させていただきたいのですが、
①OpenCVでモノクロ画像を読み込んでbitmap(8bppIndexed)にし、
panel上のpicutreBoxのGraphicsからDrawImageメソッドでカラーの直線等とともに
表示しております。(このサイトを参考にさせていただいております。)

上記方法ですと、pictureboxがパネルより大きくなると、スクロールバーが表示され、
勝手に再描画されますが、バーからマウスを放した時のみに描画され、
移動中には描画されません。

②上記を回避するため、h,vscrollbarを用意し、
スクロールバーのチェンジイベント内でbitmapの描画範囲を指定し、
ピクチャボックス全面に描画することはできたのですが、
こちらにいたしますと、モノクロ画像の上に描いたカラーの直線がチラついたり
表示できなかったりします。
(Format8bppIndexedのため、bitmapにも直接描画できない)

汎用性を考え、②のスクロールバーを用いた方法で、
①のようにモノクロbitmapとカラーの直線をうまく表示できる
方法がありましたら、お教えいただけないでしょうか。
お忙しい中申し訳ありませんが、アドバイスいただければ幸いです。
【2011/02/05 15:34】 URL | color #- [ 編集]


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














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


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

現在の閲覧者数: / 合計