ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

モーションブラー

動きながら撮影しているような画像に加工する事らしい。
ここでは全体を処理しているけど、対象がピックアップできたら該当部分だけモーションブラー処理をする事もできそう(超高速移動とか)。

  private Bitmap effectMotionBlur( Bitmap bitmap ){

    if( bitmap == null ){
      bitmap = BitmapFactory.decodeResource( getResources( ), R.drawable.original ).copy( Bitmap.Config.ARGB_8888, true );
    }

    if( bitmap == null ){
      return bitmap;
    }

    if( bitmap.isMutable( ) != true ){
      bitmap = bitmap.copy( Bitmap.Config.ARGB_8888, true );
    }

    int height   = bitmap.getHeight( );
    int width    = bitmap.getWidth( );
    int[] pixels = new int[( width * height )];
    bitmap.getPixels( pixels, 0, width, 0, 0, width, height );

    int i, j;
    int size = 10, pos;

    for( i = 0; i < width; ++i ){
      for( j = 0; j < height; ++j ){

        int r, rr, g, gg , b, bb, counts;
        r = rr = g = gg = b = bb = counts = 0;

        for( pos = -size; pos <= size; pos++ ){

          if( ( j + pos ) < 0 || height <= ( j + pos ) ||
              ( i + pos ) < 0 || width  <= ( i + pos ) ){
            continue;
          }

          int bitmapColor = pixels[( ( i + pos ) + ( j + pos ) * width )];

          rr = Color.red( bitmapColor );
          gg = Color.green( bitmapColor );
          bb = Color.blue( bitmapColor );

          r += rr;
          g += gg;
          b += bb;

          counts++;
        }

        rr = r / counts;
        gg = g / counts;
        bb = b / counts;

        pixels[( i + j * width )] = Color.rgb( rr, gg, bb );
      }
    }

    bitmap.setPixels( pixels, 0, width, 0, 0, width, height );

    return bitmap;
  }

オリジナル:
f:id:masugata:20110405125239:image:medium
モーションブラー(違いは詳細で見てください):
f:id:masugata:20110331141755:image:medium