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

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

2015-07-06 11:11 585 查看
图片的格式有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种条件下缩放,按照大的比例缩放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: