- PR -

画像を一部だけ消去したい

投稿者投稿内容
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-02-16 22:50
こんにちはみなさん。

1つ教えてほしいことがございます。

たくさんの図形がPictureBoxに書かれていた時、その一部分だけを消去したい場合、どうすればよいかご存知ですか。

リージョンとかクリッピングとか、画像の合成とかその辺りだと思うのですが、具体的にどうすれば良いかわかりません。

よろしくお願いします。

#先ほどは間違った会議室に投稿してしまいました。すみません。。。
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-02-17 10:17
引用:

るるさんの書き込み (2004-02-16 22:50) より:
こんにちはみなさん。

1つ教えてほしいことがございます。

たくさんの図形がPictureBoxに書かれていた時、その一部分だけを消去したい場合、どうすればよいかご存知ですか。

リージョンとかクリッピングとか、画像の合成とかその辺りだと思うのですが、具体的にどうすれば良いかわかりません。

よろしくお願いします。

#先ほどは間違った会議室に投稿してしまいました。すみません。。。




Invalidateメソッドを使い、Region やRectangleで消去したい範囲を指定します。
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-02-17 13:10
Hirashigeさん、ご回答ありがとうございます。

>Invalidateメソッドを使い、Region やRectangleで消去したい範囲を指定します。

はい、私の知りたかったのは、まさしくこれだと思われます。
ただ、これらの用語をキーワードにしてGoogleなどで調べましたが、使い方がよくわかりません。
この使い方をもう少し説明してもらっても良いですか。

また、次の点についてもお答えいただけるとありがたいです。
 ●「無効化」とは「画像が描かれないようにする」と同義か
 ●Regionは円や特別な形でも指定できるのか
 ●Invalidateを使った場合、BackgroundImageにある画像は表示されるか

よろしくお願い申し上げます。



よろしくお願いします。
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-02-17 13:59
引用:


>Invalidateメソッドを使い、Region やRectangleで消去したい範囲を指定します。




すいません、正確には Invalidateメソッドは指定した領域を「消去」するメソッドではありません。
Invalidateメソッドは指定した領域を無効化してその部分の再描画を行います。従って再描画の際に描画したくない図形の描画を行わないことでその図形を消すか、バックグランドと同色またはイメージでその部分の上書きすることで同様(消去のような)の効果になるかと思います。
描画方法を指定するフラッグ(以前の描画を消去して再描画か、上書きで再描画)が指定できるとおもいます。
基本的にこれを使用するためには、PictureBoxのPaintイベントをハンドルしてその中で描画するものしないものをコントロールします。

従って
>●「無効化」とは「画像が描かれないようにする」と同義か

  違います。

>●Regionは円や特別な形でも指定できるのか
 
  できると思います。

>●Invalidateを使った場合、BackgroundImageにある画像は表示されるか

  コードの書き方によります。

私自身はPictureBoxでのInvalidateは使ったことがありませんので、詳しくは、PictureBox.InvalidateやRegionのヘルプ、APIのInvalidateRect関数などのヘルプなどを見てご自分で試してみてください。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-17 14:03
1.表示領域と同じ大きさのリージョンを作成する
2.表示させたくない領域を1で作成したリージョンとXORする
3.PictureBoxのRegionプロパティに1で作成したリージョンを設定する

コード:
Region region = new Region( pictureBox1.ClientRectangle );
region.Xor( new Rectangle( 0, 0, 100, 100 ) );
pictureBox1.Region = region;



でうまくいくと思います。

●「無効化」とは「画像が描かれないようにする」と同義か
無効化は指定された領域が無効になったことをシステムに知らせて再描画してもらうことです
通常は変更のあった部分のみ再描画させる場合に使用します。

●Regionは円や特別な形でも指定できるのか
指定できます。くわしくはヘルプを参照してください

●Invalidateを使った場合、BackgroundImageにある画像は表示されるか
Invalidateではないですが上記のRegionプロパティを指定した場合BackgroundImageも
表示されませんので背景用の画像は別のPictureBoxに貼り付けて表示される画像の裏に
設置してください。
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-02-18 12:35
こんにちは、皆様

たくさんの書き込みありがとうございました。

とりあえず、ゆうじゅんさん、Hirashigeさん、別の会議室で書き込んでくださったほむら
さん、unibonさん(バグのない星にいていいですね)のご指導を参考にしていろいろ試してみたいと思います。

また、上手くいったらご報告します。

重ねて御礼申し上げます。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-02-20 12:10
unibon です。こんにちわ。

#以下、あまりまとまっていませんが。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9398&forum=25
からここへ来ましたが、invalidate の概念は、たとえて言えば、ペンキをブラシで塗ったりスプレーする時のマスキングテープをどう貼るかのような操作であり、「画像を一部だけ消去したい」用途には使えないと思います。
現在の PC の現状では、画面に図形をドロー(draw)したりビットマップを貼り付け(blt)たりするのは、とてもすばやくできるため、これがネックになることはほとんどありません。一方、そのための図形の形状の定義(構築)やビットマップの作成などには、昔ながらのコストがかかるものです。invalidate は、前者の draw や blt の段階では効きますが、これはどっちかといえばウィンドウシステムの都合で備わっているものです。

引用:

るるさんの書き込み (2004-02-16 22:50) より:
たくさんの図形がPictureBoxに書かれていた時、その一部分だけを消去したい場合、どうすればよいかご存知ですか。


を見て思ったのですが、この中の「一部分」とは、「複数の図形の内のひとつの図形」という意味でしょうか、それとも「ひとつの図形の内の一部の領域」という意味でしょうか。
私は前者だと思っていたのですが、もし後者ならば region や invalidate も有効な場合もあると思いますが。
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-02-20 18:47
引用:

unibonさんの書き込み (2004-02-20 12:10) より:

からここへ来ましたが、invalidate の概念は、たとえて言えば、ペンキをブラシで塗ったりスプレーする時のマスキングテープをどう貼るかのような操作であり、「画像を一部だけ消去したい」用途には使えないと思います。



 ちょっと違うように思います。
 Invalidate はゆうじゅんさんが書いたり、私があとで訂正したようにクライアント領域全体又は一部を無効化するメソッドです。マスキングのような使い方も出来ますが、本来は領域の一部や全体を無効化します、一部の場合は全体を書き換えるシステムの負担を軽減し、書き換えの際の画面のちらつきなどを抑える為に用います。領域の書き換えのためには暗黙又は意識的に関わらずInvalidateは発行されます。

 一度領域に描画された画像を本当の意味で消去する関数は、私の知る限り無いように思います。XORを用いる方法も結局は領域の一部を上書きするもので、pictureBox1.Region = region で消去されるのも暗黙のうちに無効化されて上書きされているのだと思います。
 そういう意味では、Invalidate は領域の一部又は書かれている図形の一部を消去する方法(何らかの形で上書きする)の入り口にはなりえるように思い、最初に提示してしまったものです。

引用:


現在の PC の現状では、画面に図形をドロー(draw)したりビットマップを貼り付け(blt)たりするのは、とてもすばやくできるため、これがネックになることはほとんどありません。一方、そのための図形の形状の定義(構築)やビットマップの作成などには、昔ながらのコストがかかるものです。invalidate は、前者の draw や blt の段階では効きますが、これはどっちかといえばウィンドウシステムの都合で備わっているものです。




 例えば、DrawReversibleFrameやDrawReversibleLineを使ってクライアント領域の一部をマウスドラッグで指定したり、線を引いたりする場合の様に細かく画面を書き換えなければならないような時に、マウス移動のたびに全体を描画していたのではスムースな操作は期待できなくなり、クライアント領域の大きさにもよりますが、必要最小限をInvalidateしないと大きなネックにならないでしょうか。

引用:


引用:

るるさんの書き込み (2004-02-16 22:50) より:
たくさんの図形がPictureBoxに書かれていた時、その一部分だけを消去したい場合、どうすればよいかご存知ですか。


を見て思ったのですが、この中の「一部分」とは、「複数の図形の内のひとつの図形」という意味でしょうか、それとも「ひとつの図形の内の一部の領域」という意味でしょうか。
私は前者だと思っていたのですが、もし後者ならば region や invalidate も有効な場合もあると思いますが。



 前者の場合、unibonさんならどの様にしますか?



[ メッセージ編集済み 編集者: Hirashige 編集日時 2004-02-20 18:51 ]

スキルアップ/キャリアアップ(JOB@IT)