android采样处理大图方法

http://www.eoeandroid.com/

http://orgcent.com/

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 ;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值