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

どうでもいい記事100選

2枚の画像から差分を抽出

こちらのページImageMagickコマンドラインツールを使って2枚の画像から差分を抽出する方法が紹介されていたけど、こういう事?すげー安直な気もするけど。。。

  // 比較する画像はお互いの縦横サイズが同一である画像を前提
  private Bitmap getDifference( ){

    Bitmap bitmapA = BitmapFactory.decodeResource( getResources( ), R.drawable.r01 ).copy( Bitmap.Config.ARGB_8888, true );
    Bitmap bitmapB = BitmapFactory.decodeResource( getResources( ), R.drawable.r02 ).copy( Bitmap.Config.ARGB_8888, true );

    int heightA   = bitmapA.getHeight( );
    int widthA    = bitmapA.getWidth( );

    int heightB   = bitmapB.getHeight( );
    int widthB    = bitmapB.getWidth( );

    int[] pixelsA = new int[( widthA * heightA )];
    int[] pixelsB = new int[( widthB * heightB )];

    bitmapA.getPixels( pixelsA, 0, widthA, 0, 0, widthA, heightA );
    bitmapB.getPixels( pixelsB, 0, widthB, 0, 0, widthB, heightB );
    
    for( int YY = 0; YY < widthA; ++YY ){
      for( int XX = 0; XX < heightA; ++XX ){

        int bitmapColorA = pixelsA[( YY + XX * widthA )];
        int bitmapColorB = pixelsB[( YY + XX * widthA )];

        int aaA = Color.alpha( bitmapColorA );
        int rrA = Color.red( bitmapColorA );
        int ggA = Color.green( bitmapColorA );
        int bbA = Color.blue( bitmapColorA );

        int aaB = Color.alpha( bitmapColorB );
        int rrB = Color.red( bitmapColorB );
        int ggB = Color.green( bitmapColorB );
        int bbB = Color.blue( bitmapColorB );

        // hsv[0] is Hue [0.0f .. 360.0f]
        // hsv[1] is Saturation [0.0f...1.0f]
        // hsv[2] is Value [0.0f...1.0f]
        // float[] hsvA = new float[3];
        // Color.RGBToHSV( rrA, ggA, bbA, hsvA );

        // float[] hsvB = new float[3];
        // Color.RGBToHSV( rrB, ggB, bbB, hsvB );

        // hsvB[0] = hsvA[0];
        // hsvB[1] = hsvA[1];
        // hsvB[2] = hsvA[2];

        // bitmapColorB = Color.HSVToColor( hsvB )
        // aaB = Color.alpha( bitmapColorB );
        // rrB = Color.red( bitmapColorB );
        // ggB = Color.green( bitmapColorB );
        // bbB = Color.blue( bitmapColorB );

        int aa, rr, gg, bb;

        if( rrA == rrB && ggA == ggB && bbA == bbB ){
          aa = 255;
          rr = 0;
          gg = 0;
          bb = 0;
        } else {
          aa = aaA;
          rr = rrA;
          gg = ggA;
          bb = bbA;
        }

        pixelsA[( YY + XX * widthA )] = Color.argb( aa, rr, gg, bb );
      }
    }

    return Bitmap.createBitmap( pixelsA, widthA, heightA, Bitmap.Config.ARGB_8888 );
  }

オリジナル:
f:id:masugata:20110404140058:image:medium
変更:
f:id:masugata:20110329130445:image:medium
差分抽出:
f:id:masugata:20110329130443:image:medium


それにしてもImageMagickは宝の山な感じがするなぁ。。。サボってないでソースコードを確認しろって事かしら。_| ̄|○