android图片处理

原创 2015年11月17日 18:06:55

anroid 如何加载大图:


    对android手机开发者来说,图片一直都是一个让人头疼的问题,因为手机的内存是有限的,
要让程序在有限的内存下工作,加载合适的图片显得尤为重要,图片过大不但对程序没有任何的
帮助,反而消耗内存,图片过小会导致显示模糊,以下将会介绍如何加载一个缩小版的图片,从
而避免超出内存限制。

1、读取位图的尺寸与类型


BitmapFactory提供了一些解码(decode)的方法(decodeByteArray(),decodeFile(),
decodeResource()等),用来从不同的资源中创建一个Bitmap。我们应该根据图片的数据来源选
择合适的解码方法。但是这些方法在构造位图的时候会尝试分配内存,因此直接使用会容易导致
内存溢出(outOfMemory)。庆幸的是每一种解码方法都可以通过BitmapFactory.Options设置一
些附加的标记,以此来指定解码选项。设置inJustDecodebounds属性为true时这些方法在解码时
不会分配内存,它会返回一个null的Bitmap,但是可以获取到outWidth,outHeight与outMimeType。
该方法允许你在构造Bitmap之前优先读取图片的尺寸与类型。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResource(),R.id.image,options);
int imageWidth = options.outWidth;
int imageHeight = options.outHeight;
String imageType = options.outMimeType;

为了避免OOM的异常,我们需要在真正解析图片之前检查它的尺寸。

2、加载一个按比例缩小的版本到内存中


    通过得到的参数可以帮助我们决定应该加载整个图片到内存中还是加载一个缩小的图片。
例如,如果把一个大小为1024*768像素的图片显示到大小为128*96像素的ImageView上,就没有
必要把整张图片都加载到内存中。

BitmapFactory.Options中提供了一个属性 inSampleSize ,该属性可以向图片按倍数缩小,
例如:一个分辨率为2048*1536的图片如果设置inSampleSize = 4,那么会产生一个大约512*384
大小的Bitmap。以下是根据目标图片大小来计算Sample图片大小的代码。

public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){
    int height = options.outHeight;
    int width = options.outWidth;
    int inSampleSize = 1;
    if(height > reqHeight || width >reWidth){
        int halfHeight = height/2;
        int halfWidth = width/2;
        while(halfHeight/inSampleSize > reqHeight && halfWidth/inSampleSize > reqWidth){
            inSampleSize *= 2;
        }
    }
    return inSampleSize;
}

使用该方法时首先需要设置inJustDecodeBounds = true,把options的值传递过来,计算并设置inSampleSize的
值后,需要设置inJustDecodeBounds = false,之后再调用相关解码方法。

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android图片处理

  • 2015年09月08日 13:31
  • 71KB
  • 下载

Android图片处理之Fresco初实践

关于 Fresco Fresco 是一个强大的图片加载组件。 Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节...

Android图片处理

  • 2013年07月23日 14:25
  • 390KB
  • 下载

android 图片处理工具

  • 2014年06月27日 10:47
  • 33KB
  • 下载

Android开发之图片处理框架(二)

今天的内容比较简单,就是在昨天的基础上加上画笔功能,点击画笔按钮,可以随意画画,再点击画笔按钮,停止画画,可以添加图片,对图片进行移动缩放等,如图所示: 这里我们考虑的做法是自定义一个类继承Vi...

android中大图片处理

  • 2013年07月30日 14:53
  • 2KB
  • 下载

android 指定角的圆角图片处理

  • 2015年07月13日 10:56
  • 18KB
  • 下载

Android第十三站 众多豪华控件 图片处理进阶

目录4.22 加载手机磁盘里的图片文件4.23 动态放大缩小ImageView里的图片运用Matrix对象来缩放图片文件4.24 动态旋转图片Bitmap与Matrix旋转ImageView 4.22...

android图片处理

  • 2014年04月26日 18:13
  • 158KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android图片处理
举报原因:
原因补充:

(最多只允许输入30个字)