- ベストアンサー
プログラムで画像の明るさを変更する方法
- 現在、プログラムで画像の明るさを変更する方法について試していますが、うまくいきません。
- 現在のプログラムでは、画像の明るさをランダムに選んで変更しているため、画像が乱れて表示されてしまいます。
- ライン毎にランダムに明るさを選ぶ方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
う~ん。。。 なんかhttp://www.okweb.ne.jp/kotaeru.php3?q=589046の#2さんのアドバイスが無になってるような (^^; #2さんもおっしゃってますが、ライン毎の変化を求めているのに、やってることはピクセル単位での変化になっちゃってますよね。これの原因が解からないというのはプログラムの力量云々とかじゃなくて、頭の整理が付いていない状態で闇雲にコーディングをしてしまっているからです。 ライン数とは、この場合「画像の縦のピクセル数」ですよね? ですから、img.getHeight() で求めた数値がライン数になります。 この数だけのランダムな真偽値が必要なのですから、まずは最初に必要な数だけの真偽値を求めてしまいましょう(余計な乱数を使わないために) int h=img.getHeight(this); boolean[] bool=new boolean[h]; Random ra=new Random(); for(int i=0; i<h; i++){ bool[i]=ra.nextBoolean(); } これで必要なだけの真偽値の配列が出来ます。 1行目のラインを変化させるかの判定値は bool[0]、2行目のラインを変化させるかの判定値は bool[1] ....... となります。 では、まずは1行目の最初のpixelを作成してみましょう。 if(bool[0]){//真なら epixels[0]=(pixels[0] & 0x00FEFEFF) >> 1; uepixels[0]=pixels[0]; } else {//偽なら epixels[0]=pixels[0]; uepixels[0]=(pixels[0] & 0x00FEFEFF) >> 1; } *注)RGBそれぞれに取り出し演算せずとも上記のようにすれば、目的の処理を1行で済ます事が出来ます(かなり余談ですけど・w) 次に、この処理を1ライン分のピクセル数繰返すように書き換えてみましょう。 1ライン分のピクセル数は img.getWidth() で求められる数値です。ここでは w ですよね。 if(bool[0]){//1行目が真なら for(int i=0; i<w; i++){ epixels[i]=(pixels[i] & 0x00FEFEFF) >> 1; uepixels[i]=pixels[i]; } } else {//1行目が偽なら for(int i=0; i<w; i++){ epixels[i]=pixels[i]; uepixels[i]=(pixels[i] & 0x00FEFEFF) >> 1; } } これで1ライン作成のアルゴリズムが出来ました。 次に、複数ラインのアルゴリズムを作りますが、ライン数分この記述を繰返すのですから、外に大きなループを作ります。 for(int i=0; i<h; i++){//ライン数分繰返すループ if(bool[i]){//i+1行目が真なら for(int j=0; j<w; j++){ epixels[i*w+j]=(pixels[i*w+j] & 0x00FEFEFF) >> 1; uepixels[i*w+j]=pixels[i*w+j]; } } else {//i+1行目が偽なら for(int j=0; j<w; j++){ epixels[i*w+j]=pixels[i*w+j]; uepixels[i*w+j]=(pixels[i*w+j] & 0x00FEFEFF) >> 1; } } } 普通、他の方は↑とは違った(もっと簡潔な)アルゴリズムの形を取るかもしれません。けれど、ワンステップずつ発展させていく形を取るという性質上、上記の記述になりました。全体の流れが見えてくれば、簡略化する場所も自ずと見えてくるはずです。 注)上記のコードは何も確認してません。脳内コンパイル&実行のみですので、間違いがあるときはご容赦を。
お礼
ご丁寧な回答ありがとうございます。実際にやってみたり悪戦苦闘したんですが、#2さんのアドバイスやtakaP-さんの貴重なアドバイスも今の私の力量ではうまく生かせる事が出来ないみたいですね。1回でプログラムを完成しようとせずに、画像を3枚を交互に表示させるのではなくまずは1枚ずつ取得してその後3枚を交互に表示させるやり方で進めていきたいと思います。その時にはtakaP-のアドバイスもわかるようになると思います^^本当にありがとうございましたー!!