`
xwangly
  • 浏览: 131902 次
  • 性别: Icon_minigender_1
  • 来自: 鄂州
社区版块
存档分类
最新评论

Android根据指定的尺寸加载Bitmap

阅读更多

因为图片的尺寸千差百异,要想加载不同的图片,又要保证不影响整体布局的美观,我们可以通过计算需要的尺寸来加载图片。

直接上代码:

 

 

    
    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值。

 

 

分享到:
评论
2 楼 飞不过海 2015-01-11  
Mybeautiful 写道
显然有问题,

return BitmapFactory.decodeStream(in, null, options); 
这句中的 in已经被前面读完了。


对的,这样出来的Bitmap是空的
1 楼 Mybeautiful 2015-01-08  
显然有问题,

return BitmapFactory.decodeStream(in, null, options); 
这句中的 in已经被前面读完了。

相关推荐

    Android下利用Bitmap切割图片

    这个方法可以将Bitmap缩放到指定的尺寸,同时保持原图像的比例: ```java // 缩放Bitmap至新的尺寸 Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, true); ``` 此外,...

    android中对Bitmap图片设置任意角为圆角

    4. 使用Matrix的postRotate方法,根据需要设定旋转角度,将原Bitmap旋转到指定位置。 5. 最后,使用Canvas的drawBitmap方法,传入旋转后的Bitmap和旋转中心点,将其绘制到圆形Bitmap上。 这个过程中,关键在于正确...

    Android-使用Matrix对Bitmap进行处理

    通过Canvas的drawBitmap方法,我们可以指定Matrix参数,让Canvas使用这个变换矩阵来绘制Bitmap。 总的来说,Android的Matrix类为我们提供了强大的图像变换能力,可以灵活地处理Bitmap。在进行图像处理时,理解...

    Android-使用Glide在Android中加载SVG

    3. 在需要加载SVG的代码中调用Glide,并指定`asBitmap()`。 通过这种方式,我们可以利用Glide的强大功能,同时享受到SVG图像带来的高清晰度和适应性。这在创建美观且响应式的Android应用时是非常有价值的。

    Android bitmap工具类

    - **Bitmap的加载与解码**:从资源文件、内存、磁盘或者网络URL加载Bitmap,并根据需求进行解码,以控制内存占用。 - **Bitmap的尺寸调整**:通过`Bitmap.createScaledBitmap()`方法,根据需要调整Bitmap的尺寸,...

    bitmap上传图片demo

    `BitmapFactory.decodeFile()`方法用于从本地文件加载Bitmap,而`Bitmap.createBitmap()`可以创建一个新的Bitmap对象,指定其尺寸、颜色格式和配置。 2. 图片加载优化: 不恰当的Bitmap使用可能导致内存溢出,因此...

    Android根据文件路径加载指定文件

    在Android开发中,有时我们需要根据文件路径...综上所述,"Android根据文件路径加载指定文件"涉及了Android的文件操作、多媒体处理、权限管理等多个方面。实际开发中,开发者需要结合具体需求,灵活运用这些知识点。

    Bitmap加载、变换、显示图片

    如果需要加载Bitmap,可以先将其转换为Drawable,再通过`Drawable`的`getBitmap()`方法。 - **从Assets目录加载**:通过`AssetManager`的`open(String fileName)`方法获取到输入流,然后使用`BitmapFactory`的`...

    处理android bitmap oom 2.0版本关闭了硬件加速

    4. **使用BitmapFactory.Options**:在加载Bitmap前,可以通过设置`inJustDecodeBounds`为true,获取图片原始尺寸,然后计算合适的缩放比例,再加载图片。 5. **使用Purgeable Bitmap**:在Android 3.0及以上版本,...

    安卓Android源码——(Bitmap位图渲染与操作).zip

    - **从资源加载**:使用BitmapFactory.decodeResource()方法从资源文件加载Bitmap。 - **从文件加载**:通过BitmapFactory.decodeFile()方法加载本地文件系统中的图片。 - **从网络加载**:通常配合AsyncTask或者...

    Android bitmap图片压缩工具类

    例如,`resizeBitmap(Bitmap bitmap, int targetWidth, int targetHeight)`方法可以将图片缩放到指定的宽度和高度,减少像素数量,从而降低内存占用。 3. **采样率压缩**: 使用BitmapFactory.Options的...

    Android bitmap

    例如,从SD卡上的一个JPEG文件加载Bitmap: ```java Bitmap bmp = BitmapFactory.decodeFile("/sdcard/dcim/tianjin.jpeg"); ``` 3. **保存Bitmap到本地** 要将Bitmap保存到SD卡,需要创建一个`File`对象表示...

    Android应用源码之(Bitmap位图渲染与操作-IT计算机-毕业设计.zip

    在Android应用中,我们经常需要加载、显示、编辑或存储Bitmap,因此理解其工作原理和最佳实践至关重要。 1. **Bitmap创建**:Bitmap可以通过多种方式创建,如从资源文件、本地文件系统、网络或者通过内存中的像素...

    Glide加载圆形图片 自定义圆角 和对指定角加载圆角

    在Android开发中,图片加载库Glide是广泛使用的工具,它能够高效地处理图片的加载、缓存和显示。在一些设计中,我们可能需要将图片显示为圆形或者具有特定圆角的效果,以达到更好的视觉体验。本篇将详细介绍如何使用...

    Android将bitmap保存到本地png/jpg格式等

    有时我们需要将Bitmap对象保存到本地,例如用户拍摄的照片或者加载的网络图片,以便后续使用或分享。本篇文章将深入探讨如何在Android中将Bitmap保存为本地的png或jpg格式。 首先,我们需要了解Bitmap对象的保存...

    Android图片缓存之Bitmap详解(一)

    - BitmapFactory是一个用于解码图像数据的工厂类,它可以从各种来源(如资源、文件、流等)加载Bitmap。 - `decodeStream(InputStream is, OutPointf outPadding, Options options)` 是一个常用的解码方法,`...

    详解android 通过uri获取bitmap图片并压缩

    android 通过uri获取bitmap图片并压缩 在 Android 开发中,获取并压缩图片是一项非常重要的任务。特别是在调用图库选择图片时,需要通过uri获取bitmap图片并进行压缩,以避免OutOfMemoryError(OOM)。本文将详细...

    Android应用源码之(Bitmap位图渲染与操作.zip

    同时,根据设备屏幕尺寸选择合适的图片资源,避免加载过大位图导致的内存问题。 10. **Bitmap的生命周期** 当Bitmap不再使用时,需要调用`bitmap.recycle()`释放系统资源,但注意回收后不能再使用。此外,Activity...

    处理bitmap内存溢出问题

    在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...

    android bitmap通过byte数组以流的形式创建

    在Android开发中,Bitmap是用于显示图像的基本类,它是一个位图对象,通常用来加载、显示和处理图片。然而,由于Bitmap对象占用大量的内存,直接加载大图片可能会导致内存溢出(Out Of Memory,OOM)问题。因此,...

Global site tag (gtag.js) - Google Analytics