因为图片的尺寸千差百异,要想加载不同的图片,又要保证不影响整体布局的美观,我们可以通过计算需要的尺寸来加载图片。
直接上代码:
public static synchronized Bitmap decodeSampledBitmapFromStream( InputStream in, int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(in, null, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeStream(in, null, options); } /** * Calculate an inSampleSize for use in a {@link BitmapFactory.Options} * object when decoding bitmaps using the decode* methods from * {@link BitmapFactory}. This implementation calculates the closest * inSampleSize that will result in the final decoded bitmap having a width * and height equal to or larger than the requested width and height. This * implementation does not ensure a power of 2 is returned for inSampleSize * which can be faster when decoding but results in a larger bitmap which * isn't as useful for caching purposes. * * @param options * An options object with out* params already populated (run * through a decode* method with inJustDecodeBounds==true * @param reqWidth * The requested width of the resulting bitmap * @param reqHeight * The requested height of the resulting bitmap * @return The value to be used for inSampleSize */ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; //先根据宽度进行缩小 while (width / inSampleSize > reqWidth) { inSampleSize++; } //然后根据高度进行缩小 while (height / inSampleSize > reqHeight) { inSampleSize++; } return inSampleSize; }
该方法通过指定大小来加载图片,并保证加载的图片宽、高均不超过指定的大小。
来看看inSampleSize的函义:
/** * If set to a value > 1, requests the decoder to subsample the original * image, returning a smaller image to save memory. The sample size is * the number of pixels in either dimension that correspond to a single * pixel in the decoded bitmap. For example, inSampleSize == 4 returns * an image that is 1/4 the width/height of the original, and 1/16 the * number of pixels. Any value <= 1 is treated the same as 1. Note: the * decoder will try to fulfill this request, but the resulting bitmap * may have different dimensions that precisely what has been requested. * Also, powers of 2 are often faster/easier for the decoder to honor. */ public int inSampleSize;
当inSampleSize大于1时,解码器会将宽和高分别缩小inSampleSize倍。
上述calculateInSampleSize方法正是通过将宽与高进行比对得出的inSampleSize值。
相关推荐
这个方法可以将Bitmap缩放到指定的尺寸,同时保持原图像的比例: ```java // 缩放Bitmap至新的尺寸 Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, true); ``` 此外,...
4. 使用Matrix的postRotate方法,根据需要设定旋转角度,将原Bitmap旋转到指定位置。 5. 最后,使用Canvas的drawBitmap方法,传入旋转后的Bitmap和旋转中心点,将其绘制到圆形Bitmap上。 这个过程中,关键在于正确...
通过Canvas的drawBitmap方法,我们可以指定Matrix参数,让Canvas使用这个变换矩阵来绘制Bitmap。 总的来说,Android的Matrix类为我们提供了强大的图像变换能力,可以灵活地处理Bitmap。在进行图像处理时,理解...
3. 在需要加载SVG的代码中调用Glide,并指定`asBitmap()`。 通过这种方式,我们可以利用Glide的强大功能,同时享受到SVG图像带来的高清晰度和适应性。这在创建美观且响应式的Android应用时是非常有价值的。
- **Bitmap的加载与解码**:从资源文件、内存、磁盘或者网络URL加载Bitmap,并根据需求进行解码,以控制内存占用。 - **Bitmap的尺寸调整**:通过`Bitmap.createScaledBitmap()`方法,根据需要调整Bitmap的尺寸,...
`BitmapFactory.decodeFile()`方法用于从本地文件加载Bitmap,而`Bitmap.createBitmap()`可以创建一个新的Bitmap对象,指定其尺寸、颜色格式和配置。 2. 图片加载优化: 不恰当的Bitmap使用可能导致内存溢出,因此...
在Android开发中,有时我们需要根据文件路径...综上所述,"Android根据文件路径加载指定文件"涉及了Android的文件操作、多媒体处理、权限管理等多个方面。实际开发中,开发者需要结合具体需求,灵活运用这些知识点。
如果需要加载Bitmap,可以先将其转换为Drawable,再通过`Drawable`的`getBitmap()`方法。 - **从Assets目录加载**:通过`AssetManager`的`open(String fileName)`方法获取到输入流,然后使用`BitmapFactory`的`...
4. **使用BitmapFactory.Options**:在加载Bitmap前,可以通过设置`inJustDecodeBounds`为true,获取图片原始尺寸,然后计算合适的缩放比例,再加载图片。 5. **使用Purgeable Bitmap**:在Android 3.0及以上版本,...
- **从资源加载**:使用BitmapFactory.decodeResource()方法从资源文件加载Bitmap。 - **从文件加载**:通过BitmapFactory.decodeFile()方法加载本地文件系统中的图片。 - **从网络加载**:通常配合AsyncTask或者...
例如,`resizeBitmap(Bitmap bitmap, int targetWidth, int targetHeight)`方法可以将图片缩放到指定的宽度和高度,减少像素数量,从而降低内存占用。 3. **采样率压缩**: 使用BitmapFactory.Options的...
例如,从SD卡上的一个JPEG文件加载Bitmap: ```java Bitmap bmp = BitmapFactory.decodeFile("/sdcard/dcim/tianjin.jpeg"); ``` 3. **保存Bitmap到本地** 要将Bitmap保存到SD卡,需要创建一个`File`对象表示...
在Android应用中,我们经常需要加载、显示、编辑或存储Bitmap,因此理解其工作原理和最佳实践至关重要。 1. **Bitmap创建**:Bitmap可以通过多种方式创建,如从资源文件、本地文件系统、网络或者通过内存中的像素...
在Android开发中,图片加载库Glide是广泛使用的工具,它能够高效地处理图片的加载、缓存和显示。在一些设计中,我们可能需要将图片显示为圆形或者具有特定圆角的效果,以达到更好的视觉体验。本篇将详细介绍如何使用...
有时我们需要将Bitmap对象保存到本地,例如用户拍摄的照片或者加载的网络图片,以便后续使用或分享。本篇文章将深入探讨如何在Android中将Bitmap保存为本地的png或jpg格式。 首先,我们需要了解Bitmap对象的保存...
- BitmapFactory是一个用于解码图像数据的工厂类,它可以从各种来源(如资源、文件、流等)加载Bitmap。 - `decodeStream(InputStream is, OutPointf outPadding, Options options)` 是一个常用的解码方法,`...
android 通过uri获取bitmap图片并压缩 在 Android 开发中,获取并压缩图片是一项非常重要的任务。特别是在调用图库选择图片时,需要通过uri获取bitmap图片并进行压缩,以避免OutOfMemoryError(OOM)。本文将详细...
同时,根据设备屏幕尺寸选择合适的图片资源,避免加载过大位图导致的内存问题。 10. **Bitmap的生命周期** 当Bitmap不再使用时,需要调用`bitmap.recycle()`释放系统资源,但注意回收后不能再使用。此外,Activity...
在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...
在Android开发中,Bitmap是用于显示图像的基本类,它是一个位图对象,通常用来加载、显示和处理图片。然而,由于Bitmap对象占用大量的内存,直接加载大图片可能会导致内存溢出(Out Of Memory,OOM)问题。因此,...