android 图片格式和像素引发的问题
来源:互联网 发布:生产看板软件 编辑:程序博客网 时间:2024/05/22 02:31
图片的格式有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种条件下缩放,按照大的比例缩放。
- android 图片格式和像素引发的问题
- WPF 布局心得 一个像素引发的问题和思考
- AndroidStdio-图片格式引发的异常
- android studio中图片格式的问题
- Android支持的图片格式
- Android支持的图片格式
- Retinex实验效果图和图片格式转化的失真问题
- android中关于像素的问题
- .NET : 关于图片格式的问题
- android 软件覆盖安装引发的问题
- android.os.Debug.waitForDebugger() 引发的问题
- android:一个Open键引发的问题!!
- Android中dp和px的转化问题,以及如何获得手机分辨率和像素密度
- android应用程序图片格式的选择
- android 密度,像素问题
- Android 像素问题
- 指针和内存可能引发的问题
- C++ char[] 和 char* 引发的问题
- 【Developing Log】数据库连接权限非动态
- Spring(之二)--深入研究
- NYOJ 65 另一种阶乘问题
- recv函数的用法详解
- 中兴通讯携智慧轨道(iRail)解决方案参加非洲轨交展
- android 图片格式和像素引发的问题
- AFNetwork学习(一)
- Unity3D 资源路径
- Linux文件管理相关命令
- wake_lock 的使用方法
- Android 解决Dex超出方法数的限制问题
- Gensim官方教程翻译(六)——分布式计算(Distributed Computing)
- Android 图片压缩也即生成缩略图方法
- Android 23种设计模式