質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

6313閲覧

【C#】画像の再描画について

Gluek731

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/02/04 16:27

編集2022/01/12 10:55

C#の仕様について質問です。

現在、Wiiリモコンを用いて電子黒板のシステムを作ろうとしています。Wiiリモコンのライブラリを用いて赤外線を受信し、そこにマウスカーソルを追従させるものです。

そこで、いろんなスクリーンやディスプレイの大きさに対応するために、キャリブレーションの処理を用いろうと考えています。

まず、赤外線を移すスクリーンの四隅に照準を出して、そこを赤外線で当てて初期値を取るものです。

そこで照準を描画し、赤外線を受け取るごとに他の場所に照準を描画する処理を入れようとしたのですが、1か所目の描画をしたときに再描画をしたら「Argumentexception 使用されたパラメータが有効ではありません」という表記が出ます。

調べたところリソースリークによるものではないかと思い、使った変数のリソースの解放をしたのですが、それでも治りません。これは一体どうすればいいのでしょうか・・・

分かる方がいれば教えていただきたいです。

C#

1public void Calibration(WiimoteState ws) 2 { 3 int X_Screen = Screen.PrimaryScreen.Bounds.Width; 4 int Y_Screen = Screen.PrimaryScreen.Bounds.Height; 5 6 //描画先のオブジェクトを生成 7 Bitmap canvas = new Bitmap(X_Screen, Y_Screen); 8 //ImageオブジェクトのGraphicsオブジェクト作成 9 Graphics g = Graphics.FromImage(canvas); 10 11 //画像読み込み 12 Image img = Image.FromFile(@"C:\Users\Gluek\Documents\Visual Studio 2010\Projects\WiimoteLib01\WiimoteLib01\img\rticle.png"); 13 //画像をcanvasに表示(画像変数, x位置, y位置, 横の大きさ, 縦の大きさ) 14 g.DrawImage(img, X_Screen-50, 0, 50, 50); 15 //Imageオブジェクトのリソース解放 16 img.Dispose(); 17 //GRaphicsオブジェクトのリソース解放 18 g.Dispose(); 19 //PictureBox1に表示させる 20 pictureBox2.Image = canvas; 21 //赤外線を受信したら以下の処理をする 22 if (ws.IRState.IRSensors[0].Found) 23 { 24 pictureBox2.Image.Dispose(); 25 pictureBox2.Image = null; 26 pictureBox2.Refresh(); 27 g.DrawImage(img, 200, 0, 50, 50); 28 pictureBox2.Image = canvas; 29 } 30 31 } 32 #endregion 33

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

破棄されたオブジェクトにアクセスしているからでしょう。

Dispose実行の位置を適切に修正してください。

C#

1// imgの破棄 2img.Dispose(); 3// gの破棄 4g.Dispose(); 5// Imageにcanvasを設定 6pictureBox2.Image = canvas; 7 8if (ws.IRState.IRSensors[0].Found) 9{ 10 // Image(=canvas)を破棄 11 pictureBox2.Image.Dispose(); 12 pictureBox2.Image = null; 13 pictureBox2.Refresh(); 14 15 // 破棄されているgで破棄されているimgを破棄されているcanvasに描画。 16 g.DrawImage(img, 200, 0, 50, 50); 17 18 pictureBox2.Image = canvas; 19}

投稿2016/02/05 05:05

wakuwaku

総合スコア386

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gluek731

2016/02/05 09:22

回答ありがとうございます。 回答の内容を簡潔にまとめると「オブジェクトを再描画する前にそのオブジェクトを破棄しているためアクセスが出来ない」と考えていいのでしょうか? 少なくとも再描画を繰り返す為には複数個キャンバスを用意したほうがいいのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問