2017-02-17 5 views
3

アンドロイドビットマップのスケーリングとサンプリングの間に混乱があります。ここでは、スケーリングのための2つのコードと、サンプリングのためのもう1つのコードがあります。
ビットマップのスケーリングとサンプリングの違いは何ですか?

スケーリング:

public static Bitmap getScaleBitmap(Bitmap bitmap, int newWidth, int newHeight) { 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 

    Matrix matrix = new Matrix(); 
    matrix.postScale(scaleWidth, scaleHeight); 
    return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false); 
} 

サンプリング:ここ

mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(),R.id.myimage, 100, 100)); 

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
     int reqWidth, int reqHeight) { 

    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

public static int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     while ((halfHeight/inSampleSize) >= reqHeight 
       && (halfWidth/inSampleSize) >= reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

両方のコードでは、私は良いとシンプルである1を識別することができますので、どのように画像のサイズ変更はなく、別の方法を実行します。

答えて

0

スケーリング:まず、メモリ内のビットマップ全体をデコードして、それをスケーリングします。

サンプリング:ビットマップ全体をメモリにロードせずに、必要なスケーリングビットマップを取得します。

0

最初のコードは、ビットマップを取り、新しい小さなビットマップを作成します。より大きなビットマップにはmemmoryを使用します。

2番目のコードはリソースを消費します。 inJustDecodeBoundsビットマップ全体をmemmoryにロードしないようにします。次に、どのようにサイズを変更するかを計算し、再度inJustDecodeBoundsをfalseに設定してmemmory縮小イメージにロードします。デコードされた画像にのみmemmoryを使用します。

Oficial docs

関連する問題