您的位置:首页 > 移动开发 > Android开发

Android使用BitmapFactory.Options解决加载大图片内存溢出问题

2012-08-20 13:44 771 查看
由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存溢出(java.lang.OutOfMemoryError),只有在BitmapFactory加载图片时使用BitmapFactory.Options对相关参数进行配置来减少加载的像素。

1、设置缩放大小对图片作处理

public Bitmap getBitmapFromFile(File dst,int width,
int height){

if (null!= dst
&& dst.exists()){

BitmapFactory.Options opts =null;

if (width
> 0 && height
> 0) {

opts = new BitmapFactory.Options();

opts.inJustDecodeBounds =true;

BitmapFactory.decodeFile(dst.getPath(), opts);

// 计算图片缩放比例

final int minSideLength=
Math.min(width, height);

opts.inSampleSize = computeSampleSize(opts, minSideLength,

width * height);

opts.inJustDecodeBounds =false;

opts.inInputShareable =true;

opts.inPurgeable =
true;

}

try {

return BitmapFactory.decodeFile(dst.getPath(), opts);

} catch
(OutOfMemoryError e)
{

e.printStackTrace();

}

}

return null;

}
public staticint 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;

}

}
/**

* 图片转换成字符串[BASE64]

*

* @return

*/

public String getImageBinary(String path) {

System.out.println("path--->" + path);

try {



Bitmap bitmap = getBitmapFromFile(new File(path),640,640);//scalePicture(path,640,640);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bitmap.compress(CompressFormat.PNG,100,baos);

String uploadBuffer = new String(Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT));

baos.flush();

baos.close();

System.out.println("图片信息转换成字符串为:---->" + uploadBuffer);

return uploadBuffer;

}

catch(IOException e)

{

e.printStackTrace();

}

catch (Exception e) {

e.printStackTrace();

}



return null;

}





返回Base64字符串
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: