位图的缩放和采样有什么区别?

时间:2017-02-17 13:06:27

标签: android bitmap android-bitmap

我在android位图缩放和采样之间有困惑这里可能有两个代码用于缩放,另一个用于采样任何人都可以帮助我识别这两个代码的工作以及它们之间的主要区别。

缩放:

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

这里两个代码执行图像大小调整但方式不同,所以我如何识别哪一个是好的和简单的。

2 个答案:

答案 0 :(得分:0)

缩放:首先,您在内存中解码整个位图,然后进行缩放。

采样:您可以获得所需的缩放位图,而无需在内存中加载整个位图。

答案 1 :(得分:0)

第一个代码,采用位图并创建新的较小位图 - 您可以将memmory用于更大的位图。

第二个代码需要资源。 inJustDecodeBounds这样做就可以不将整个位图加载到memmory中。然后计算它应该如何调整大小,然后再将inJustDecodeBounds设置为false加载到memmory缩小版本的图像中。因此,您只能将memmory用于解码图像

Oficial docs

相关问题