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

どうでもいい記事100選

トイカメラ風

あくまでも「風」です。_| ̄|○
軽く調べてみた感じでは明るさを落としてコントラストを強めに調整。でもってボカシを入れて四隅を黒くする。。。で合ってるのかな?

  // トイカメラ風
  private Bitmap effectToyCamera( 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 );

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

    bitmap = effectShadeing( bitmap, 170 );
    bitmap = mergeBitmap( bitmap, BitmapFactory.decodeResource( getResources( ), R.drawable.moyamoya ).copy( Bitmap.Config.ARGB_8888, true ) );

    return bitmap;
  }

  // ぼかし
  private Bitmap effectShadeing( Bitmap bitmap, int range ){

    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 ) );
        
        if( range <= 0 ||
            !( i < ( ( width  / 2 ) + range ) && ( ( width  / 2 ) - range ) < i &&
               j < ( ( height / 2 ) + range ) && ( ( height / 2 ) - range ) < j ) ){
          pixels[( i + j * width )] = Color.rgb( rr, gg, bb );
        }
      }
    }

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

    return bitmap;
  }

  // 画像を合成
  private Bitmap mergeBitmap( Bitmap bitmap1, Bitmap bitmap2 ){

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

    if( bitmap2 == null ){
      return bitmap1;
    }

    int height1 = bitmap1.getHeight( );
    int width1  = bitmap1.getWidth( );

    int height2 = bitmap2.getHeight( );
    int width2  = bitmap2.getWidth( );

    float scaleWidth  = ( (float)width1 )  / width2;
    float scaleHeight = ( (float)height1 ) / height2;
    Matrix matrix     = new Matrix( );
    matrix.postScale( scaleWidth, scaleHeight );
    Bitmap mergeBitmap = Bitmap.createBitmap( bitmap2, 0, 0, width2, height2, matrix, true );


    Bitmap newBitmap   = Bitmap.createBitmap( width1, height1, Bitmap.Config.ARGB_8888 );
    Canvas canvas      = new Canvas( newBitmap );
    canvas.drawBitmap( bitmap1,     0.0f, 0.0f, null );
    canvas.drawBitmap( mergeBitmap, 0.0f, 0.0f, null );

    return newBitmap;
  }

オリジナル:
f:id:masugata:20110405125239:image:medium
黒いもやもや(詳細で見てください):
f:id:masugata:20110330182455:image:medium
黒いもやもや有 ボカシ一部(真ん中ボカシ無し)(違いは詳細で見てください):
f:id:masugata:20110405111221:image:medium
黒いもやもや有 ボカシ全部(違いは詳細で見てください):
f:id:masugata:20110405111213:image:medium
黒いもやもや有 ボカシ無し(違いは詳細で見てください):
f:id:masugata:20110405111204:image:medium


黒いもやもやを合成しないと以下のような感じになります。
黒いもやもや無 ボカシ一部(真ん中ボカシ無し)(違いは詳細で見てください):
f:id:masugata:20110330173457:image:medium
黒いもやもや無 ボカシ全部(違いは詳細で見てください):
f:id:masugata:20110330173447:image:medium
黒いもやもや無 ボカシ無し(違いは詳細で見てください):
f:id:masugata:20110330173436:image:medium


黒いもやもや感が再現できなきなかったので画像を合成して無理やり対応。_| ̄|○
黒いもやもや画像は透明度を調整しています(真ん中辺りは透明度が多め。端に行く程、透明度が少ない)。
レトロやメロウな感じの懐かしい雰囲気が出せると嬉しいんだけどな。。。


色々と試行錯誤しているけど、HSVの処理が上手くいかない。。。想定外の動きをしている?思った通りに処理してくれない。
自分が全然理解していないダケだったらいいんだけど。。。現状の計算は色々と試行錯誤した上で一番良かった感じの計算値を採用してます。
段々と力任せに無理やり処理している気がしているけど。。。GIMPPhotoshopの使い方が少しだけ上達したので前向きに行こっと。_| ̄|○


他にも色々と加工しているので、小出しに出していくカモ。
ご指摘や参考情報などありましたら、ご連絡ください。<(_ _)>