位图的重新采样以及对大图的重新处理

位图的重新采样以及对大图的重新处理
由于在做项目时 有时会加载很多图像资源 而不同的图像有着不同的尺寸和类型
为了能够从更多资源中创建位图android 提供了 BitmapFactory类 通过BitmapFactory类所提供的解码方法(decodeResource()…..)来请求分配内存构造位图 因此就会导致 outofMemory 为了避免通过请求分配内存来构造位图 可以设置inJustDecodeBounds位true 虽然位图对象返回null 但是设置了outWidth outHeight 和outMimeType 通过这种方式在创建位图也就是分配内存之前就能读取图像的尺寸和类型

处理较大的位图实例:
BitmapFactory.Options op=new BitmapFactory.option();
op.inJustDecodeBounds=true;
BitmapFactory.decodeResource(getResources(),R.id.image,op)
int imageHeight =op.outHeight;
int imageWidth =op.outWidth ;
String imageType=op.outMimeType;

如若让一个大图加载一个更小的版本到内存中 在你的BitmapFactory.Option对象中设置inSampleSize=true 例如 分辨率2048*1536图像 通过inSampleSize值为4去编码将产生一个大约512*384位图加载到这个内存中需要0.75MB

public static int calculateSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight){
//获取位图的宽高
final int width=options.outWidth;
final int height=options.outHeight;
int inSampleSize = 1;
if(height>reqHeight||width>reqWidth){
//如果宽大于高 则按高的长度来处理获取inSampleSize
if(width>height){

inSampleSize=Math.round((float)height/(float)reqHeight);}
else{
inSampleSize=Math.round((float)width/(float)reqWidth);}

    } 
    return inSampleSize; 
    }

使用2的幂书设置inSampleSize 的值可以使解码器更快
1首先解码 讲inJustDecodeBounds 设置为true将选项传递进去再次解码在使用新的inSampleSizd值并将inJustDecodeBOUNDS 设置false

public static Bitmap decodeSampledBitmapFromResource(Resources res,int resid,int reqWidtg,int reqHeight){
final BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(res, resid,options);
options.inSampleSize=calculateinSampleSize(options,reqWidtg,reqHeight)
options.inJustDecodeBounds=false;
return BitmapFactory.decodeResource(res, resid,options);}

package com.example.android;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.widget.ImageView;

public class largemage extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView image = (ImageView) findViewById(R.id.show);
        Bitmap b=   decodeSampledBitmapFromResource(getResources(),R.drawable.qw,500,50);
        image.setImageBitmap(b);
    }

    public static Bitmap decodeSampledBitmapFromResource(Resources res,int resid,int reqWidtg,int reqHeight){
    final BitmapFactory.Options options=new BitmapFactory.Options();
    options.inJustDecodeBounds=true;
    BitmapFactory.decodeResource(res, resid,options);
    options.inSampleSize=calculateSampleSize(options,reqWidtg,reqHeight);
            options.inJustDecodeBounds=false;
            return BitmapFactory.decodeResource(res, resid,options);}

    public static int calculateSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int width = options.outWidth;
        final int height = options.outHeight;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {

            if (width > height) {
                inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                inSampleSize = Math.round((float) width / (float) reqWidth);
            }

        }
        return inSampleSize;
    }
}

你可能感兴趣的:(android,位图)