- ベストアンサー
静止画像上に表示する線の改良方法とは?
- 静止画像(img)の上に表示している線を、静止画像の輝度情報が半分(50%)になっている線(画質が劣化している線)を表示させるように改良したい。
- 改良方法は、setColorの部分を変える。
- プログラムは、画面上に表示している静止画像(img)の上に、ランダムに黒色のライン(buffer)を数本表示するもの。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
import java.applet.*; import java.awt.*; public class Ap extends Applet implements Runnable{ Image img; Image buffer; Graphics bufferGraphics; Thread thread; public void init(){ img = getImage(getDocumentBase(), "abc.jpg"); buffer = createImage(100, 100); bufferGraphics = buffer.getGraphics(); bufferGraphics.drawImage(img, 0, 0, this); } うちでもいろいろやってみました。 問題のプログラムの前半を↑のようにして(クラス名は適当につけました)、 アプレットとして実行してみるといちおう動作しました。 細かい点として、ソースにあった > g.drawImage(buffer,0,0,null); は > g.drawImage(buffer,0,0,this); の方がいいかもしれません。 前回の(0, 0, 0, 128)という色情報は、 前から順に赤、緑、青、アルファ値を0~256の範囲で指定しています。 アルファ値というのは透明度です。128ぐらいにすると 下の色が半分透けて見えます。 これはfloatで指定することも可能です。 その場合、 new Color(0.0, 0.0, 0.0, 0.5); のようになります。 詳しくはAPIドキュメント(持ってますよね?)の Colorのところを見てください。 いろいろやってみて、プログラムにいくつか疑問が生じました。 後半のスレッド関係のところ、このままではあまり意味が無いようですが、 これは何を意図したものでしょうか? また、このままだと、paint()は画面が書き換えられるときだけしか意味を持ちません。 つまり、「他のウィンドウの下になって、また出てきた」「最小化されて、また最大化された」 などのときのみです。 これは何を意図しているのでしょうか? 想像ですが、TV画像がぶれたような効果? その場合、 > Thread.sleep(10); の後にrepaint();と入れるとそうなりますが…。
その他の回答 (2)
- liar_adan
- ベストアンサー率48% (730/1515)
>に変えてみたところ画像は表示されませんでした(^^; あれ、おかしいな。できるはずなんだけど。 このbufferGraphicsはどこから取ったGraphicsでしょうか? ダブルバッファリング用に作ったImageのGraphics打と思いますが、 それはコンポーネントのcreateImage()で作ったものでしょうか? それとも、BufferedImageクラスのイメージでしょうか? BufferedImageのイメージなら、それを生成するとき、 new BufferedImage(x, y, BufferedImage.TYPE_INT_RGB); のように作ったでしょうか。それならば new BufferedImage(x, y, BufferedImage.TYPE_INT_ARGB); に変えてください。TYPE_INT_RGBはアルファ値を保存しないものです。 TYPE_INT_ARGBだとアルファ値が使えるイメージになります。 原因がそれで無い場合、ちょっとわかりませんが、 イメージの素性について補足ください。
補足
遅くなりました(>_<) paint()の前のinit()の中でcreateImage()を用いているので、createImage()で作ったものだと思います。以前回答いただいた(0,0,0,128)という所がよくわかりませんでした。これはどのような色情報を意味しているのですか?それとも色情報ではないですか?
- liar_adan
- ベストアンサー率48% (730/1515)
色を作ります。 黒とか赤とかのよく使われる色は、Colorクラスに用意されていますが、 それ以外のものはColorオブジェクトを作ります。 (コンストラクタの詳細についてはAPIドキュメントを見てください) Color c = new Color(0, 0, 0, 128); bufferGraphics.setColor(c); でできます。 bufferGraphics.setColor(new Color(0, 0, 0, 128)); でもいいかな。
お礼
bufferGraphics.setColor(Color.black); の部分をbufferGraphics.setColor(new Color(0, 0, 0, 128));に変えてみたところ画像は表示されませんでした(^^; int r = (int)(pixels[i]&0x00ff0000); if (r!=0x00000000){r = ((int)((pixels[i]&0x00ff0000)*0.5)&0x00ff0000);} int g = (int)(pixels[i]&0x0000ff00); if (g!=0x00000000){g = ((int)((pixels[i]&0x0000ff00)*0.5)&0x0000ff00);} int b = (int)(pixels[i]&0x000000ff); if (b!=0x00000000){b = ((int)((pixels[i]&0x000000ff)*0.5)&0x000000ff);}のようにr.g.bに色情報を与えて、何かできないですかね?(pixelsには静止画像データが入っています。)
お礼
ありがとうございました。これは、ネット上に公開されている画像を、画像を更新するたびに黒色のラインがランダムに表示されるというプログラムです。このラインを輝度が50%のラインにしてrepaint()して、別々のラインが引かれた画像を順次表示することによりネット上で普通の画像が公開されているように見せるものです。これによりprintscreenキーでコピーされた画像ではラインがばらばらな画像が取得できるため不正コピーを防げるというものです。長くてわかりずらいですかね(^^;