Android中对加载大图的处理
2015-11-01 23:09
501 查看
1.先看加载原理:Android中图片是以像素的形式加载到内存中。png、bmp、jpg等格式的图片(位图文件),都是以像素表述图片大小的。虚拟机的内存并不是无限的大,而是当前应用程序所能分配的内存。当图片的大小超过虚拟机内存的大小,就会出现OutOfMemoryError
2.如何解决?
a.思路: 把图片一相应的比例缩小,而不影响视觉效果。
代码如下:
b.用Google本身提供的一套解决方案BitmapFun,它可以解决加载图片慢,OOM的问题.其中的ImageFetcher就是根据图片三级缓存原理来处理图片:先在内存中找,内存中找不到再在文件中找,最后是网络查找。清理图片缓存的时候可以用DiskLruCache.clearCache,一键清除。
c. 还可以使用xUtils中专门针对图片的BitmapUtils。
2.如何解决?
a.思路: 把图片一相应的比例缩小,而不影响视觉效果。
代码如下:
public class ImageActivity extends Activity { private EditText imageShow_et; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image); imageView = (ImageView) findViewById(R.id.image_iv); } public void showImage(View view) { // 1.图片解析的配置: BitmapFactory.Options options = new Options(); options.inJustDecodeBounds = true;// 加载图片的时候,只获取该图片的属性,而不返回bitmap // 2.获取图片的宽高信息 BitmapFactory.decodeFile( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/big.JPG", options); int pictureWidth = options.outWidth; int pictureHeight = options.outHeight; // 3.获取手机屏幕的宽高 WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); Display phoneDisplay = wm.getDefaultDisplay(); Point outSize = new Point(); phoneDisplay.getSize(outSize); int screenWidth = outSize.x; int screenHeight = outSize.y; // 4.设置缩放比例: int dx = pictureWidth / screenWidth; int dy = pictureHeight / screenHeight; int scale = 1; if (dx > dy && dx > 1) { scale = dx; } if (dy > dx && dy > 1) { scale = dy; } // 5.设置图片的采样比例,对图片以缩放比例来显示图片 options.inSampleSize = scale; options.inJustDecodeBounds = false;// 真的解析图拍了,并返回Bitmap Bitmap bitmap = BitmapFactory.decodeFile( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/big.JPG", options); imageView.setImageBitmap(bitmap); } }
b.用Google本身提供的一套解决方案BitmapFun,它可以解决加载图片慢,OOM的问题.其中的ImageFetcher就是根据图片三级缓存原理来处理图片:先在内存中找,内存中找不到再在文件中找,最后是网络查找。清理图片缓存的时候可以用DiskLruCache.clearCache,一键清除。
c. 还可以使用xUtils中专门针对图片的BitmapUtils。
相关文章推荐
- Oracle索引(B*tree与Bitmap)的学习总结
- 如何使用Matrix对bitmap的旋转与镜像水平垂直翻转
- C语言实现的bitmap位图代码分享
- C++中Cbitmap,HBitmap,Bitmap区别及联系
- bitmap 索引和 B-tree 索引在使用中如何选择
- Android中的Bitmap缓存池使用详解
- Android Bitmap和Drawable相互转换的简单代码
- android中Bitmap用法(显示,保存,缩放,旋转)实例分析
- 解析Android开发优化之:对Bitmap的内存优化详解
- Android 的Bitmap的修改方法
- 数据结构之位图(bitmap)详解
- 浅析KJFrameForAndroid框架如何高效加载Bitmap
- python实现bitmap数据结构详解
- Android优秀开源库收集
- Bitmap裁图
- 浅析android中Bitmap的使用
- Android OOM 问题的总结
- Bitmap那些事之内存占用计算和加载注意事项
- Android Bitmap那些事之如何优化内存
- Bitmap/byte/drawable相互转换