Javaを使った静止画像に奇数ラインと偶数ラインを表示するプログラムの輝度をランダム化する方法

このQ&Aのポイント
  • Javaを使用して静止画像に奇数ラインと偶数ラインを表示するプログラムを作成しました。
  • 奇数ラインと偶数ラインの表示は1/100秒間隔で交互に行われます。
  • 奇数ラインと偶数ラインの輝度が下がっている部分をランダムにする方法についてアドバイスをお願いします。
回答を見る
  • ベストアンサー

プログラムについて

javaを使って静止画像にラインをつけて、その奇数ライン画像(偶数ラインは輝度が下がっている画像)と偶数ライン画像(奇数ラインは輝度が下がっている画像)の2枚の画像を1/100秒間隔で交互に表示させ、実際に見ているぶんには普通の静止画像が表示されているというプログラムを作りました。この輝度が下がっているところは奇数ラインと偶数ラインのように決まっているのですが、これを輝度が下がっているところがランダムになるようにとりたいのですがどうるればよいかわかりません... わかる方いましたら何かアドバイスなどお願いします。m(_ _)m for(int i=0; i < w*h ; i++){ try{ int r = (int)(pixels[i]&0x00ff0000); if (r!=0x00000000){r = ((int)((pixels[i]&0x00ff0000)*90/100)&0x00ff0000);} int g = (int)(pixels[i]&0x0000ff00); if (g!=0x00000000){g = ((int)((pixels[i]&0x0000ff00)*90/100)&0x0000ff00);} int b = (int)(pixels[i]&0x000000ff); if (b!=0x00000000){b = ((int)((pixels[i]&0x000000ff)*90/100)&0x000000ff);} if((((w+i)/w)%2)!=0){epixels[i] = 0xff000000| r | g | b ;uepixels[i]=pixels[i];} else {epixels[i] = pixels[i];uepixels[i] = 0xff000000| r | g | b ;} }catch(Exception ex){;} } これがそのプログラムの、交互に表示している場所だと思うのですが。

  • mos21
  • お礼率46% (128/273)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

試さないで書いているので、バグってるかもしれませんが、たとえば、こんな感じとか。 int i = 0; for ( int y = 0; y < h; y++ ){ boolean flg_dim = random() < 0.5; for ( int x = 0; x < w; x++ ){ int p = pixels[ i ]; int dimmed = p / 10; epixels[ i ] = p; uepixels[ i ] = p; if ( flg_dim ){ epixels[ i ] -= dimmed; } else { uepixels[ i ] = dimmed; } i++; } } ループをwidthとheightに分割しているのが、ミソ。

mos21
質問者

お礼

試してみたけれど動かなかったですね(^^; でも参考になりました。ありがとうございましたm(_ _)m

関連するQ&A

  • 意味がわかりません

    for(int i=0; i < w*h ; i++){ try{ int r = (int)(pixels[i]&0x00ff0000); if (r!=0x00000000){r = ((int)((pixels[i]&0x00ff0000)*90/100)&0x00ff0000);} int g = (int)(pixels[i]&0x0000ff00); if (g!=0x00000000){g = ((int)((pixels[i]&0x0000ff00)*90/100)&0x0000ff00);} int b = (int)(pixels[i]&0x000000ff); if (b!=0x00000000){b = ((int)((pixels[i]&0x000000ff)*90/100)&0x000000ff);} if((((w+i)/w)%2)!=0){epixels[i] = 0xff000000| r | g | b ;uepixels[i]=pixels[i];} else {epixels[i] = pixels[i];uepixels[i] = 0xff000000| r | g | b ;} }catch(Exception ex){;} } このようなプログラムがあるのですが、何をしているのかがわかりません。 見づらいかもしれませんがどなたかわかる方よろしくお願いします。

  • プログラムで

    次のtry文がよくわからなくて困っています。わかる方いましたら解説お願いします。 try{ 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);} if((((w+i)/w)%2)!=0){epixels[i] = 0xff000000| r | g | b ; uepixels[i]=pixels[i];} else {epixels[i] = pixels[i]; uepixels[i] = 0xff000000| r | g | b ;} }catch(Exception ex){;} }

    • ベストアンサー
    • Java
  • プログラムで

    以前も似たような質問をしたのですが、いろいろとやってみたのですがわからなくてまた質問しました。現在、次のようなプログラムを書いています。 int w = img.getWidth(this); int h = img.getHeight(this); int[] pixels = new int[w * h]; int[] epixels = new int[w * h]; int[] uepixels = new int[w * h]; int scan = w; int offset = 0; PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,scan); try{pg.grabPixels(); } catch(InterruptedException e){;} for(int i=0; i < w*h ; i++){ 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);} if((ra.nextInt()%2)!=0) { epixels[i] = 0xff000000| r | g | b ; uepixels[i]=pixels[i]; } else { epixels[i] = pixels[i]; uepixels[i] = 0xff000000| r | g | b ; } (Exception ex){;} } しかし、これですとiが1進む毎にランダムに真または偽をとってしまうため、実際に動かしてみた所「砂嵐」のように画像が表示されました。このランダムにとるのを、1ライン目はそのままの明るさで2ライン目は明るさ半減していて3ライン目も明るさ半減していて・・・といった感じにライン毎にランダムに「そのままの明るさのライン」か「明るさが半減しているライン」かをとるように改良するにはどうしたらいいでしょうか?お願いします。

    • ベストアンサー
    • Java
  • int型について

    1枚の静止画像の明るさを、1行おきにではなくてランダムに、元の色使いのままの行と、明るさを半減した行を持つという画像を2枚作成したいのですが、次のプログラムの記述ではif((r.nextInt()%2)!=0){の部分でintは間接参照できません。というエラーが出てしまいました。なぜでしょうか?わかる方いましたらお願いします。 先に記述してあるプログラムを後で記述したプログラムに改良したところエラーが起こってしまいました。 こちらが改良前で if((((w+i)/w)%2)!=0){ epixels[i] = 0xff000000| r | g | b ; uepixels[i]=pixels[i];} else {    epixels[i] = pixels[i];uepixels[i] =  0xff000000| r | g | b ;} こちらが改良後です。 if((r.nextInt()%2)!=0){ epixels[i] = 0xff000000|r|g|b; uepixels[i] = pixels[i]; } else{ epixels[i] = pixels[i]; uepixels[i] = 0xff000000|r|g|b; }

    • ベストアンサー
    • Java
  • 質問です。

    1枚の静止画像を、1行おきに、元の色使いのままの行と、明るさ半減した行を合成するというプログラムなのですが。偶数行を半減させるか、奇数行を半減させるかではなくてランダムに行を半減させるにはどうすればよいのでしょうか?RandomクラスやMathクラスを使用すればよいでしょうか? if((((w+i)/w)%2)!=0){  epixels[i] = 0xff000000| r | g | b ;  uepixels[i]=pixels[i]; } else {  epixels[i] = pixels[i];  uepixels[i] = 0xff000000| r | g | b ; }

    • ベストアンサー
    • Java
  • 意味がわかりません

    javaのプログラムでこのようなものがあったのですがよくわかりません、解説をお願いします。配列変数pixelsのi番目の値の何をr,g,bに入れているのかがよくわかりません。わかる方いましたら、お願いします。 for(int i=0; i < w*h ; i++) { try { 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); }

    • ベストアンサー
    • Java
  • ビットマップを直接編集して背景画像を波打たせる

    質問(1) pixelsは一次元配列で1ラインのx方向の要素を左方向や右方向にシフト量sだけ離れた所へコピーすることにより1ラインの画像のピクセルデータをシフト量sだけずらして波打たせる効果を持たせていることは想像つきますが、これではy方向を考慮した全てのラインをずらすことにはなっていない様な感じがします。y方向はどうなっているのですか? 質問(2) int line = y*bmpdata.Stride/4;で4で割っているのは何故ですか? 質問(3) if(s<0){ //左へコピー for(int x=-s; x<BITMAP_W; x++){ if(x+s>=0){ pixels[line+x+s] = pixels[line+x]; } } } でこのif文の中の条件式x+s>=0はint x=-s;→int x+s=0;…;x++により明らかに常に真ではないですか?もし、そうだとしたらこのif文は必要ないのではないですか? 質問(4) } else if(s>0){ //右へコピー for(int x=BITMAP_W; x>=s; x--){ if(x+s<BITMAP_W){ pixels[line+x] = pixels[line+x-s]; } } } } でこのif文の中の条件式x+s<BITMAP_Wの意味が良く分かりません。 質問(5)(6)(7) for(int y=0; y<BITMAP_H; y++){ … int line = y*bmpdata.Stride/4;の意味が良く分かりません。質問(5) … pixels[line+x+s] = pixels[line+x];でlineを加えているのは何故ですか?質問(6) … pixels[line+x] = pixels[line+x-s];でlineを加えているのは何故ですか?質問(7) C言語、C++言語初心者なので分かりやすく教えて下さい。 宜しくお願いします。 プログラムコード(animation.cpp) //ウェーブエフェクト UINT g_wavecount; const int BITMAP_H = 480; const int BITMAP_W = 320; float g_wavelines[BITMAP_H]; //ウェーブエフェクト初期化 void ResetWave(){ g_wavecount = 0; float r=0, rdelta=3.14f/12;//波の数 float waveh = 3;//波の高さ for(int i=0; i<BITMAP_H; i++){ g_wavelines[i] = sinf(r) * waveh; r += rdelta; } } //ウェーブエフェクト描画 void RenderWave(Gdiplus::Bitmap *bmp){ g_wavecount++; int topline = g_wavecount % BITMAP_H; //ビットマップのロック Gdiplus::BitmapData bmpdata; Gdiplus::Status status = bmp->LockBits( &Gdiplus::Rect(0,0,320,480), Gdiplus::ImageLockModeWrite, bmp->GetPixelFormat(), &bmpdata); if(status != Gdiplus::Ok) return; UINT* pixels = (UINT*)bmpdata.Scan0; //←この行から下のコードが全部分からない。 //ビットマップを加工する for(int y=0; y<BITMAP_H; y++){ //シフト量を取得 int s = (int)g_wavelines[(topline+y)%BITMAP_H]; int line = y*bmpdata.Stride/4; //ピクセルコピー if(s<0){ //左へコピー for(int x=-s; x<BITMAP_W; x++){ if(x+s>=0){ pixels[line+x+s] = pixels[line+x]; } } } else if(s>0){ //右へコピー for(int x=BITMAP_W; x>=s; x--){ if(x+s<BITMAP_W){ pixels[line+x] = pixels[line+x-s]; } } } } bmp->UnlockBits(&bmpdata); }

  • プログラムの平均値の出し方。

    プログラムの平均値の出し方。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } } このプログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。

  • 助けてください

    10は偶数で5の倍数です。 11は素数です。 12は偶数で6の倍数です。 13は素数です。 14は偶数で7の倍数です。 15は奇数で5の倍数です。 16は偶数で8の倍数です。 17は素数です。 18は偶数で9の倍数です。 19は素数です。 20は偶数で10の倍数です。 と出力させたいのですが、 H:\>java SuuNoSyurui 11は奇数で0の倍数です。 12は偶数で0の倍数です。 13は奇数で0の倍数です。 14は偶数で0の倍数です。 15は奇数で0の倍数です。 15は素数です。 16は偶数で0の倍数です。 17は奇数で0の倍数です。 17は素数です。 18は偶数で0の倍数です。 19は奇数で0の倍数です。 19は素数です。 20は偶数で0の倍数です。 -- Press any key to exit (Input "c" to continue) -- こうでてしまいます。 下のが立てたプログラムです。 public class SuuNoSyurui { public static void main(String[] args) { int i=1,j=2; int n1=10; int n2=20; int n=n2-n1; int baisu=0; for(i=1;i<=n;i++) { if (i%2==0){ System.out.println("\t"+(i+n)+"は偶数で"+baisu+"の倍数です。"); } else { System.out.println("\t"+(i+n)+"は奇数で"+baisu+"の倍数です。"); } for(j=3;j<=(i-2);j +=2) { if (((i-2)%j==0) && ((i-2)%2)==1){ System.out.println("\t"+(i+n)+"は素数です。"); } } } } }

  • ヒストグラム均等化処理プログラム

    どなたか以下のヒストグラム均等化処理プログラムを解説して頂けないでしょうか。特にgetMinMax関数とgetHistEqu関数で、何がしたいのか訳がわかりません。 以下のプログラムは、ヒストグラム均等化処理部分のみですが、分かる範囲でいいので、解説お願いします。 ------------------------------------------------------- // ヒストグラム均等化による画素値の割り当てを決定する // hist :入力画像のヒストグラム // min :割り当てられる画素値の最小 // max :割り当てられる画素値の最大 // たとえば,min[5]=4 max[5]=6の場合,画素値5には4-6の範囲に割り当てられる // pixs_min :最小値が割り当てられる画素数 // pixs_max :最大値が割り当てられる画素数 // ave :各画素値に割り当てられる画素数 //★★特にmin,max,pixs_min,pixs_maxの説明の意味が分からないのです。 int getMinMax(int *hist,int *min,int *max,int *pixs_min,int *pixs_max,int ave) { int i; int rest; int now; int pixels; int a,b; rest=0; now=0; for(i=0;i<256;i++) { pixels=rest+hist[i]; min[i]=now; if(rest>0) pixs_min[i]=ave-rest; else pixs_min[i]=ave+100; a=pixels/ave; rest=pixels%ave; max[i]=now+a; if(rest>0) pixs_max[i]=rest; else pixs_max[i]=ave+100; now+=a; } for(i=0;i<255;i++) { if(min[i]>255) min[i]=255; if(max[i]>255) max[i]=255; } max[255]=255; pixs_max[255]=ave*10; } // ヒストグラム均等化による画素値の決定 // 割り当てられる画素値の最小,最大の間で順番に割り当てていく // ただし,最小,最大については割り当てる画素数に制限がある int getHistEqu(int x,int *now,int *min,int *max,int *pix_min,int *pix_max) { int res; if(now[x]==max[x]) { if(pix_max[x]<=0) now[x]=min[x]; else pix_max[x]--; } if(now[x]==min[x]) { if(pix_min[x]<=0) now[x]=min[x]+1; else pix_min[x]--; } if(now[x]>max[x]) now[x]=min[x]; res=now[x]; now[x]++; return res; } int effect(ImageData *img,ImageData *outimg) { int x,y; int rr,gg,bb; int ro,go,bo; int i; int val; int ave; int histR[256],histG[256],histB[256]; // ヒストグラム int omaxR[256],omaxG[256],omaxB[256]; // 変換後,割り当てられる画素値の最小 int ominR[256],ominG[256],ominB[256]; // 変換後,割り当てられる画素値の最大 int pix_maxR[256],pix_maxG[256],pix_maxB[256]; // 最小値が割り当てられる画素数 int pix_minR[256],pix_minG[256],pix_minB[256]; // 最大値が割り当てられる画素数 int onowR[256],onowG[256],onowB[256]; // 次に割り当てる画素値 Pixel pix; for(i=0;i<256;i++) { histR[i]=histG[i]=histB[i]=0; } ave= img->height * img->width /256; // 画像の全画素数/画素値の範囲 // ヒストグラム作成 for(y=0;y<img->height;y++) { for(x=0;x<img->width;x++) { getPixel(img,x,y,&pix); //画像上の画素情報を取得 rr=pix.r; gg=pix.g; bb=pix.b; histR[rr]++; histG[gg]++; histB[bb]++; } } // 画素値の割り当て決定 getMinMax(histR,ominR,omaxR,pix_minR,pix_maxR,ave); getMinMax(histG,ominG,omaxG,pix_minG,pix_maxG,ave); getMinMax(histB,ominB,omaxB,pix_minB,pix_maxB,ave); for(i=0;i<256;i++) { onowR[i]=ominR[i]; onowG[i]=ominG[i]; onowB[i]=ominB[i]; } // ヒストグラム均等化処理 for(y=0;y<img->height;y++) { for(x=0;x<img->width;x++) { getPixel(img,x,y,&pix); //画像上の画素情報を取得 ro=pix.r; go=pix.g; bo=pix.b; rr=getHistEqu(ro,onowR,ominR,omaxR,pix_minR,pix_maxR); gg=getHistEqu(go,onowG,ominG,omaxG,pix_minG,pix_maxG); bb=getHistEqu(bo,onowB,ominB,omaxB,pix_minB,pix_maxB); pix.r=rr; pix.g=gg; pix.b=bb; setPixel(outimg,x,y,&pix); // 画像に値をセットする } } return 0; }

専門家に質問してみよう