Android使用BitmapFactory.Options解决加载大图片内存溢出问题
2012-08-20 13:44
771 查看
由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存溢出(java.lang.OutOfMemoryError),只有在BitmapFactory加载图片时使用BitmapFactory.Options对相关参数进行配置来减少加载的像素。
1、设置缩放大小对图片作处理
/**
* 图片转换成字符串[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字符串
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字符串
相关文章推荐
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- 转!Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Android(decode文件转成bitmap)使用BitmapFactory.Options解决加载大图片内存溢出
- Android使用BitmapFactory.Options压缩图片解决加载大图片内存溢出
- BitmapFactory.Options解决Android加载图片内存溢出的问题
- android使用异步加载解决图片内存溢出问题
- Android有效解决加载大图片时内存溢出的问题
- Android有效解决加载大图片时内存溢出的问题
- 解决Android加载图片时内存溢出的问题