2017-02-17 2 views
3

У меня есть путаница между масштабированием и выборкой растрового изображения в андроиде, здесь может быть два кода для масштабирования, а другой для выборки может помочь мне определить работу этого двух кода и основные различия между ними.
В чем разница между масштабированием и выборкой растрового изображения?

Scaling:

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

Sampling:

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

здесь как код выполнения изменения размера изображений, но по-другому, так как я могу определить, какой один хороший и простой.

ответ

0

Масштабирование: Во-первых, вы декодируете все растровое изображение в памяти, а затем масштабируете его.

Сэмплирование: Вы получаете требуемое масштабированное растровое изображение без загрузки всего растрового изображения в память.

0

Первый код, принимает растровое изображение и создает новое меньшее растровое изображение - вы должны использовать memmory для большего растрового изображения.

Второй код берет ресурс. inJustDecodeBounds Делает это так, что вы не загружаете весь битмап в memmory только для информации. Затем вычислите, как он должен быть размером, а затем снова, когда установлено inJustDecodeBounds на ложную загрузку в memmory, уменьшенную версию изображения. Поэтому вы должны использовать memmory только для декодированного изображения

Oficial docs

Смежные вопросы