android 图片格式和像素引发的问题

图片的格式有bmp,png,jpg等格式,相对来说,同样一张图片,bmp可能就大点,图片大小是由像素,我们买来的手机的500万像素指的就是这个概念。

比如我们一张应用图标是72*72,那他就是由宽72个像素和高72个像素的组成。


但每个像素是多少大小呢,

像素最大值是ff 在内存中占用8位, R,G,B 3个分别是24位,RGB前面还有个ff表示透明度,所以完成的表示一个颜色的一个像素需要32位,如0xffffccff.在内存种32位的大小就是4个Byte,所以72*72的大小就应该是72*72*4/1024,这样刚好是1KB。但实际大小可能比这个小,因为类似bitmp,png都是有其压缩算法的,保存的时候有单色位图,24位位图(把透明度去掉)

24位就有2的24次方的颜色,足以让人眼分辨不出来啦


而android分配给每个应用程序的堆内存都是有限的,大概15M多,如果一张图片足够大的话就会引起OOM。


为了解决这个问题,我们就对图形进行了缩放,缩放的原理也是比较简单,就是把几十个像素缩放成1个,这样就减小了,列如,PNG的图片压缩算法就会把同一块区域内的相同或者相近的颜色快用同一种颜色来表示。


问题,我们如何来加载一张比较大的图片来防止OOM呢,

首先获取屏幕的宽和高,这里演示是屏幕,控件的就比较复杂

WindowManager wm = getWindowManager();
int screenWidth = wm.getDefaultDisplay().getWidth();
int screenHeight = wm.getDefaultDisplay().getHeight();

如果是直接调用如下方法,如果图片比较大,就有问题,所以我们要新加一个参数。

Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg");



获取图片宽高用这个

BitmapFactory.Options opts = new Options();//解析位图的附加条件

opts.inJustDecodeBounds = true;//不去解析真实的位图,只是获取这个位图的头文件信息,这个不需要去申请像素的控件。

Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts);

int bitmapWidth = opts.outWidth;
int bitmapHeight = opts.outHeight;

//3.计算缩放比例
int dx = bitmapWidth/screenWidth;
int dy = bitmapHeight/screenHeight;
int scale = 1;
if(dx>dy&&dy>1){
System.out.println("按照水平方法缩放,缩放比例:"+dx);
scale = dx;
}

if(dy>dx&&dx>1){
System.out.println("按照垂直方法缩放,缩放比例:"+dy);
scale = dy;
}
//4.缩放加载图片到内存。
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;//真正的去解析这个位图。
bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts);
iv.setImageBitmap(bitmap);


只有在2种条件下缩放,按照大的比例缩放。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值