Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

アプレット画面の任意の座標の色を取得したい。

ペイントソフトにバケツ塗り機能をつけたいと思っています。
どのようにしたら実装できるのか?ということで、私は以下のほうにできればできるんじゃないかと考えています。

クリックされた座標(x,y)を含む部分を塗りつぶしたい。
まず(x,y)の色を取得。 set_color
Paint関数で、g(Graphics),x,y,set_color,fill(塗りつぶしたい色)を引数に自作のfills関数を呼び出し。
以下fills関数。
(x,y)の色がset_colorと同じかどうか比較。
同じだったら、その座標を塗りつぶす。
(x,y)の四方八方の座標を新たな座標の引数にしてfills関数を呼び出す。 再帰
異なっていたら、returnする。

この考えを実装させるために、アプレット画面の任意の座標の色を取得する方法が知りたいと思っています。
そもそもその方法があるのか?の前に、この方法でうまくいくのか?重くなったりするのだろうか?とも思っています。

描画のほうはすべてPaint関数内で行っています。
描画に使える色は、赤・オレンジ・黄色などの虹色を含む11色です。
塗りつぶしができるようにしたい範囲については、〜色で囲まれた範囲ではなく、画面の範囲あるいは何かしらの線で囲まれている範囲にしたいと思っています。

6

回答

12178

閲覧

6件の回答

評価

0

画像キャプチャーって手もあるようですが複雑になるでしょうから
BufferedImage に作画してそれを drawImage で丸ごと表示するのが
単純で簡単だと思います。
全ての作画処理をこのイメージに対して行うように変更しないと行けませんが、
この方法なら画面ではなくイメージの画素の色を確認すれば済みます。

評価

0

グローバルで
private Image offImage;
と宣言し、
init関数で
offImage = createImage(1000,1000);
としてみることにしました。

paint関数で
Graphics gv = offImage.getGraphics();
としてoffImageに描画し、
g.drawImage(offImage, 0, 0, 1000, 1000, this);
で画面に出力させています。
でも、自由線や消しゴムのときはpaintではなくmouseDragged関数で描画させているので、ドラッグしている最中は描画されているのですが、放すと消えてしまいます。
そこでmouseDragged関数でもpaint関数で行ったことと同じようなことをしようと思ったのですが、g.drawImage(offImage, 0, 0, 1000, 1000, this);
の最後の引数がthisのままではだめなようで。
何を引数にすればいいのでしょうか?

評価

0

あ。
そういえば最初に
>描画のほうはすべてPaint関数内で行っています。
って書いていました・・・

正しくは、
自由線の描画や、消しゴムツールによる描画はmouseDragged関数記憶させた座標をもとに同じ関数内で行っています。
そのほか直線・三角形・四角形・円などの図形は、mousePressed関数やmouseReleased関数で記憶させた座標をもとにpaint関数で描画させています。

座標はすべて記憶しているわけではなく、今必要としている座標のみ記憶させるようにしています。
paint関数はフレームレートに従って呼び出されるようですが、呼ばれるたびに画面クリアなどを行っていないため、前の状態のうえに新たに描画されるようになっているので、裏画面処理的なことを行う前の状態では新たに描くとそれまでに描いていたものが消えてしまうことはありませんでした。

評価

0

自由線を描画したときに消えてしまう問題は自己解決しました。
mouseDragged関数でもoffImageに描画した後drawImageしないといけないものだと思っていたのですが、別にそんな必要はないのですね。
また、
Graphics gv = offImage.getGraphics();
としてgvに描画させれば、どこで行っていてもoffImageに描画されたことになるのですね。

自由線や消しゴムモードのとき描画(ドラッグ)し終わってから画面に描画されて、以前のように描画している最中には描画されたりしなくなってしまったのですが、これは仕方がないのでしょうか?

そのoffImageから色を取得する方法は、これから調べてみようと思います。

評価

0

どういうタイミングで画面に反映されるのかは理解してるの
かな。
それが分かるなら、そのタイミングで起こることを自分で起
こしてやればいい。

評価

0

mouseDraggedの最後でrepaint();を呼んだら前みたいにできました。
任意の位置でrepaint();を呼ぶまでは、処理が終わる(ドラッグが終わる)まではrepaint();が呼ばれないからあのようなことが起こったのですね。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。