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

どうでもいい記事100選

ミニチュア模型風

あくまでも「風」ですが。_| ̄|○
画像の雰囲気に依存する部分もありますが、ぼかしを入れてコントラストを強めに調整する事でミニチュア模型風になるようです。もうちょっとコントラストを調整してもよい気もするけど。。。
斜め上からっていうよりかは遠目から被写体を撮ると上手くいきやすい。被写界深度がポイントのようです。

基本的にはトイカメラ風の画像を加工する処理と変わっていませんが、ぼかしを入れる部分が中心から四角を残すのではなくて縦か横のラインにしてみました。
ぼかし部分と素の部分の境界線が気になっていたので、ピクセル数を徐々に変化させています。。。多少は良くなったけど、まだまだ気になる。_| ̄|○

  // ミニチュア模型風
  private Bitmap effectScaleModel( Bitmap bitmap, int range, int lineFlg, Boolean flg ){

    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 );
    }

    bitmap = effectShadeingLine( bitmap, range, lineFlg );

    if( flg != true ){
      return bitmap; 
    }

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

    for( int YY = 0; YY < width; ++YY ){
      for( int XX = 0; XX < height; ++XX ){

        int bitmapColor = pixels[( YY + XX * width )];

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

        // hsv[0] is Hue [0.0f .. 360.0f]
        // hsv[1] is Saturation [0.0f...1.0f]
        // hsv[2] is Value [0.0f...1.0.0f]
        float[] hsv = new float[3];
        Color.RGBToHSV( rr, gg, bb, hsv );

        hsv[1] *= 1.5f;
        hsv[2] -= 0.1f;

        if( 1 < hsv[1] ){
          hsv[1] = 1.0f;
        } else if( hsv[1] < 0 ){
          hsv[1] = 0.0f;
        }

        if( 1 < hsv[2] ){
          hsv[2] = 1.0f;
        } else if ( hsv[2] < 0 ){
          hsv[2] = 0.0f;
        }

        pixels[( YY + XX * width )] = Color.HSVToColor( hsv );
      }
    }

    bitmap.setPixels( pixels, 0, width, 0, 0, width, height );
    
    return bitmap;
  }
  
  // ぼかし(ライン)
  private Bitmap effectShadeingLine( Bitmap bitmap, int range, int lineFlg ){

    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, ii, jj;
    int pixel = 3;

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

        int r, g, b;
        float sumR, sumG, sumB;
        sumR = 0.0f;
        sumG = 0.0f;
        sumB = 0.0f;

        for( ii = -pixel; ii <= pixel; ii++ ){
          for( jj = -pixel; jj <= pixel; jj++ ){

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

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

            r = Color.red( bitmapColor );
            g = Color.green( bitmapColor );
            b = Color.blue( bitmapColor );

            sumR += (float)r;
            sumG += (float)g;
            sumB += (float)b;
          }
        }

        int rr, gg, bb;
        rr = (int)( sumR / Math.pow( ( 1 + ( 2 * pixel ) ), 2 ) );
        gg = (int)( sumG / Math.pow( ( 1 + ( 2 * pixel ) ), 2 ) );
        bb = (int)( sumB / Math.pow( ( 1 + ( 2 * pixel ) ), 2 ) );

        Boolean flg = false;

        if( range > 0 ){
          if( lineFlg == 1 ){
            if( !( i < ( ( width / 2 ) + range ) && ( ( width / 2 ) - range ) < i ) ){
               flg = true;
            }
            
            if( ( ( width / 2 ) - ( range * 2 ) )         <= i && i < ( ( width / 2 ) - range - ( range / 2 ) ) ||
                ( ( width / 2 ) + range + ( range / 2 ) ) <= i && i < ( ( width / 2 ) + ( range * 2 ) ) ){
              pixel = 2;
            } else if( ( ( width / 2 ) - range - ( range / 2 ) ) <= i && i < ( ( width / 2 ) - range ) ||
                       ( ( width / 2 ) + range )                 <= i && i < ( ( width / 2 ) + range + ( range / 2 ) ) ){
              pixel = 1;
            } else {
              pixel = 3;
            }
          } else {
            if( !( j < ( ( height / 2 ) + range ) && ( ( height / 2 ) - range ) < j ) ){
               flg = true;
            }
            
            if( ( ( height / 2 ) - ( range * 2 ) )         <= j && j < ( ( height / 2 ) - range - ( range / 2 ) ) ||
                ( ( height / 2 ) + range + ( range / 2 ) ) <= j && j < ( ( height / 2 ) + ( range * 2 ) ) ){
              pixel = 2;
            } else if( ( ( height / 2 ) - range - ( range / 2 ) ) <= j && j < ( ( height / 2 ) - range ) ||
                       ( ( height / 2 ) + range )                 <= j && j < ( ( height / 2 ) + range + ( range / 2 ) ) ){
              pixel = 1;
            } else {
              pixel = 3;
            }
          }
        } else {
          flg = true;
        }

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

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

    return bitmap;
  }

ミニチュア風 オリジナル:
f:id:masugata:20110519154521:image:medium
ミニチュア風 縦(違いは詳細で見てください):
f:id:masugata:20110519154530:image:medium
ミニチュア風 横(違いは詳細で見てください):
f:id:masugata:20110519154508:image:medium
ミニチュア風 縦 ぼかしのみ(違いは詳細で見てください):
f:id:masugata:20110519154502:image:medium
ミニチュア風 横 ぼかしのみ(違いは詳細で見てください):
f:id:masugata:20110519154457:image:medium


本当だったら被写体を自動的に検出してぼかしを入れないとか高度な実装したいんですけどね。。。まだまだ未熟。_| ̄|○