一、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代码示例。