博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BitmapFactory.Options.inSampleSize 的使用方法
阅读量:6569 次
发布时间:2019-06-24

本文共 2193 字,大约阅读时间需要 7 分钟。

BitmapFactory.decodeFile(imageFile);

用BitmapFactory解码一张图片时。有时会遇到该错误。

这往往是因为图片过大造成的。

要想正常使用,则须要分配更少的内存空间来存储。

BitmapFactory.Options.inSampleSize

设置恰当的inSampleSize能够使BitmapFactory分配更少的空间以消除该错误。inSampleSize的详细含义请參考SDK文档。

比如:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

设置恰当的inSampleSize是解决该问题的关键之中的一个。BitmapFactory.Options提供了还有一个成员inJustDecodeBounds。

BitmapFactory.Options opts = new BitmapFactory.Options();opts.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

设置inJustDecodeBounds为true后,decodeFile并不分配空间。但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个參数,再通过一定的算法,就可以得到一个恰当的inSampleSize。

public 
static Bitmap createImageThumbnail(String filePath){  
     Bitmap bitmap = null;        BitmapFactory.Options opts = 
new BitmapFactory.Options();  
     opts.inJustDecodeBounds = true;        BitmapFactory.decodeFile(filePath, opts);  
        opts.inSampleSize = computeSampleSize(opts, -
1
128*
128);  
     opts.inJustDecodeBounds = false;     
     try {            bitmap = BitmapFactory.decodeFile(filePath, opts);  
     }catch (Exception e) {           
// TODO: handle exception  
    }       
return bitmap;  
}     
public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {       
int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);  
    int roundedSize;       
if (initialSize <= 
8) {  
        roundedSize = 1;           
while (roundedSize < initialSize) {  
            roundedSize <<= 1;           }  
    } else {           roundedSize = (initialSize + 
7) / 
8 * 
8;  
    }       
return roundedSize;  
}     
private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) {       
double w = options.outWidth;  
    double h = options.outHeight;       
int lowerBound = (maxNumOfPixels == -
1) ?

 

1  : (
int ) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));  
    int upperBound = (minSideLength == -1) ?

 

128  :(
int ) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));       
if (upperBound < lowerBound) {  
        // return the larger one when there is no overlapping zone.           
return lowerBound;  
    }       
if ((maxNumOfPixels == -
1) && (minSideLength == -
1)) {  
        return 1;       } 
else 
if (minSideLength == -
1) {  
        return lowerBound;       } 
else {  
        return upperBound;       }  
}  

转载地址:http://zhpjo.baihongyu.com/

你可能感兴趣的文章
WCF寄宿到Windows Service
查看>>
Ajax.ActionLink()方法的使用
查看>>
csdn 泄露用户密码害人不浅啊。
查看>>
ThinkPadT440 Ubuntu14.04 RTL8192EE 链接无线网
查看>>
OpenCV Windows7 VC6.0安装以及HelloWorld
查看>>
苹果开发人员账号注冊流程
查看>>
微铺子点单系统具体介绍 - 争做国内最专业的微信商店平台,微信外卖订餐系统!...
查看>>
ExecuteScalar
查看>>
hdu1213 How Many Tables
查看>>
依赖注入框架Autofac的简单使用
查看>>
pomelo源代码分析(一)
查看>>
白话经典算法系列之七 堆与堆排序
查看>>
开机就提示“请安装TCP/IP协议,error=10106”的解决的方法
查看>>
一个HexToInt的C/C++函数
查看>>
使用SVN进行项目版本管理
查看>>
【vijos】1729 Knights(匈牙利)
查看>>
浅谈ASP.net处理XML数据
查看>>
抽象基类
查看>>
Linux 下Tomcat的启动、关闭、杀死进程
查看>>
第一章. ActionScript 语言基础
查看>>