@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

画像を一部削除したい

1
投稿者投稿内容
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-02-16 16:47
皆様こんにちは。

さて、1つ質問があります。

例えばPictureBoxにたくさん図が描かれているとします。
その1つの図だけを削除、移動したい場合どうすればよいのでしょうか。

下のURLに示す解説では、全ての図の情報を最後に取得して、再度描画しているのですが、
そうした場合、非常に遅くなります。

そこで、変更があった図だけを描画したいのですが何か良い方法はないでしょうか。

●全てを描画するのではなく、一部だけを描画する方法
●一部分だけClearする方法

をもしご存知な方いましたら教えていただけると本当に助かります。

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

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

引用:

るるさんの書き込み (2004-02-16 16:47) より:
下のURLに示す解説では、全ての図の情報を最後に取得して、再度描画しているのですが、
そうした場合、非常に遅くなります。


結論から書きますと、残念ながらこのやりかたがもっとも効率が良いやりかたです。ビットマップ画像ならではの性質があるため、小細工で再描画を分けて必要最小限の描画だけをしようとするとその管理に逆にコストがかかってしまうため、結局は全部描き直してしまうほうが総合的にコストが低くなることがほとんどです。
もっとも、XOR で描画するとか、すでに描画してあるピクセルには上書きしない、などの制約をつければその限りではないですが、でもそういう仕様はあまり多くはありません。
もし、無理に一部だけの描画やクリアをやろうとすれば、今まで描画の対象になったピクセルをすべて記憶しておき、そのピクセルに上書きする前に、そのピクセルの現在の色を覚えておいてから、そのピクセルに新しい色を設定する、ようなことをする必要があるでしょう。一種のアンドゥ(undo)の管理に近いものになります。が、このために覚えていなければならない情報量は相当のものになりますので、上述のように全部描画し直しのほうが手っ取り早くできるのです。
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-02-17 13:34
unibonさん、ご回答ありがとうございます。
#こりん星ってすごいところで働いていらっしゃるんですね。

そうなんですか。やはり、現状が良いのですか。。。(ぐすん)
私の作成しているアプリケーションは、
サーバー・クライアント型の描画ツールですので、図形情報の取得に時間がかかるんです。
ですので、このような質問をさせていただいたのです。

先ほど「InvalidateでRegionを指定すればいい」とうかがったのですが、この方法は
ご存知ないですか?
(実は別の会議室で同じ内容の書き込みをしてしましました。すみません)

この部分のソースをいじるのに本当に時間を費やしており、
また、Unibonさんから良いアドバイスを頂いたことですので、
そろそろ見切りをつけたいと思いますが、最後にもう少しだけあがかして下さい。

ということで、Unibonさん、皆様ご教授よろしくお願いします。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-17 14:16
ども、ほむらです。
----
googleキーワード:.NET Graphics Clip
で検索したら
クリッピング領域を指定して画像の一部を表示する
http://dobon.net/vb/dotnet/graphics/setclip.html
なんていうのが出てきましたけど。。。

>図形情報の取得に時間がかかるんです。
とあるあたり、クリッピングしただけでは解消しないのではないかなー
なんておもっていたりして。。。

昔のDOSゲームのように消し描きした方が無難しれませんよ。
更新領域はプログラム単位で管理しているだろうと思いますし
更新前のデータはクライアント側に残っていますし。。。

クライアントだけの場合には今なら
(共通領域(背景とか)を別バッファに書き込んでおいて)
バックバッファに背景上書き
プライオリティの低い順にキャラクタの書き込み
プライマリバッファに転送
とやったほうが効率よかったりします。

unibon氏も言っていますが一部分だけとというのは結構コストのかかるものです。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-17 16:53
引用:

先ほど「InvalidateでRegionを指定すればいい」とうかがったのですが、この方法は
ご存知ないですか?



別の会議室でも書きましたがInvalidateは指定された部分を無効化することによって
その部分のみ再描画するようになります。

通常は移動前の領域と移動後を領域をInvalidateで指定してその部分のみ再描画させます。

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-02-18 10:00
unibon です。こんにちわ。
#ここはバグがなくて、良い星です。

引用:

るるさんの書き込み (2004-02-17 13:34) より:
(実は別の会議室で同じ内容の書き込みをしてしましました。すみません)


知りませんでした。探したら、
「Insider.NET 会議室」の件名「画像を一部だけ消去したい」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9407&forum=7
ですよね。
ここ(「IT Architect 会議室」)が間違いのようなので、以降は「Insider.NET 会議室」のほうで続ければ良いと思いますので、そこへ移動しましょう。
1

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