您的位置:

详解创建缩放位图之createscaledbitmap

一、createscaledbitmap比例

在Android开发中,我们常常需要根据不同的需求对图片进行缩小或放大。createscaledbitmap函数就是专门用于创建缩放位图的。其中最常用的参数scale就是用于指定缩放比例,它可以是小数,也可以是整数,用于缩放原始位图的宽和高。如果指定了该参数为1,那么创建的位图将与原始位图大小一致。如果指定该参数为2,则可以将宽和高都缩放为原始位图的一半。

下面是使用createscaledbitmap函数制定缩放比例的Java代码示例:

Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original_image);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, originalBitmap.getWidth()/2, originalBitmap.getHeight()/2, false);
imageView.setImageBitmap(scaledBitmap);

二、createscaledbitmap会拉升选取

createscaledbitmap函数在将原始位图缩放到目标宽高之后,可能会出现像素拉伸的情况。举个例子,如果我们将一个200 x 200像素的位图缩放成100 x 50像素的大小,那么缩放后图片就会变形,看起来宽度明显比原来要拉长。

为了解决这个问题,Android提供了一个选项叫做filter,在createScaledBitmap函数中,可以通过该参数来确定是否对位图进行滤波处理以防止像素变形。这个参数取值为true或false,如果为true就开启滤波处理,缩放后的图片会比原来的更加平滑、更加接近原始图片。如果为false,则关闭这个设置。

下面的代码是通过createScaledBitmap函数实现缩放和滤波处理的Java代码示例:

Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original_image);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, originalBitmap.getWidth()/2, originalBitmap.getHeight()/2, true);
imageView.setImageBitmap(scaledBitmap);

三、与createscaledbitmap相关的设定

在实际开发过程中,使用createscaledbitmap函数通常需要结合其他一些相关设定,来实现更好的图片缩放和调整效果。下面列出了三个常用的相关设置:

1. injustdecodebounds

这个设定通常被用于反复调整之前,用于在不实际加载图片的情况下获取图片的原始大小和宽高信息。在专门使用缩放位方式来处理图片的时候,这个选项可以帮助我们更好地了解目标图片的真实宽高信息,同时避免在实际处理图片时可能出现的位图内存分配问题。

以下是使用inJustDecodeBounds创建缩放位图的Java代码示例:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.original_image, options);
int width = options.outWidth;
int height = options.outHeight;

options.inJustDecodeBounds = false;
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original_image, options);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, width/2, height/2, true);
imageView.setImageBitmap(scaledBitmap);

2. insampleize

insampleize这个选项通常与inJustDecodeBounds和createScaledBitmap函数配合使用,用于动态获取imageview的大小和图片原始尺寸的比例,从而动态计算缩放比例,避免出现拍照时因为分辨率太大导致OOM。在实际开发中,我们常常会遇到要在imageview中显示图片的情况,此时我们应该先调用getViewTreeObserver和onGlobalLayout这两个函数获取imgeview的宽高,然后再通过insampleize来计算缩放比例,最后给原始图片缩放至指定比例即可。

以下示例代码演示了如何使用insampleize和onGloabalLayout两个选项,来计算图片的缩放比例,从而实现精准的图片缩放:

imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int targetWidth = imageView.getWidth();
        int targetHeight = imageView.getHeight();

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.original_image, options);
        int originalWidth = options.outWidth;
        int originalHeight = options.outHeight;

        int scaleFactor = Math.min(originalWidth/targetWidth, originalHeight/targetHeight);

        options.inJustDecodeBounds = false;
        options.inSampleSize = scaleFactor;

        Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original_image, options);
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, targetWidth, targetHeight, true);
        imageView.setImageBitmap(scaledBitmap);
    }
});

3. transforms

transforms选项通常与createScaledBitmap函数配合使用,是Android提供的一个媒体库扩展选项。该选项用于在缩放图片时实现一些额外的效果,比如旋转、透明度修改等。如果我们需要在缩放图片时实现一些个性化的调整效果,可以使用transforms来实现。

以下是使用transforms进行图片缩放和调整的Java代码示例:

Matrix matrix = new Matrix();
matrix.postRotate(90); // 旋转90度
matrix.postScale(0.5f, 0.5f); // 缩小50%
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original_image);
Bitmap transformedBitmap = Bitmap.createBitmap(originalBitmap, 0, 0, originalBitmap.getWidth(), originalBitmap.getHeight(), matrix, true);
imageView.setImageBitmap(transformedBitmap);

总结

在Android开发中,图片缩放是一个非常常见的需求,我们通常使用createscaledbitmap函数来实现。该函数的作用是根据指定宽高和缩放比例,创建一个缩放后的位图。本文从缩放比例和拉伸选取、与createscaledbitmap相关的选项三个方面详细阐述了该函数的用法,并给出了多个Java代码示例。