高效加载大图(官方例子)
来源:互联网 发布:软件立项申请表 编辑:程序博客网 时间:2024/06/04 20:55
生成一个Bitmap,主要有两种形式 Bitmap的静态方法和BitmapFactory的静态方法(decode);
Bitmap的enum有两个:Bitmap.CompressFormat定义图片格式PNG,JPEG,WEBP;Bitmap.Config定义图片属性,ARGB-8888(4个字节),GRB-565(2个字节),ARGB-4444(弃用建议使用8888),ALPHA-8;
BitmapFactory提供了一些解码(decode)方法(decodeByteArray(), decodeFile(), decodeResource()等),用来从不同的资源中创建一个Bitmap。每一种解码方法都可以通过BitmapFactory.Options设置一些附加的标记,以此来指定解码选项。设置 inJustDecodeBounds 属性为true
可以在解码的时候避免内存的分配,它会返回一个null
的Bitmap,但是可以获取到 outWidth, outHeight 与 outMimeType。该技术可以允许你在构造Bitmap之前优先读图片的尺寸与类型。
BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(getResources(), R.id.myimage, options);int imageHeight = options.outHeight;int imageWidth = options.outWidth;String imageType = options.outMimeType;
一个分辨率为2048x1536的图片,如果设置 inSampleSize 为4,那么会产出一个大约512x384大小的Bitmap。加载这张缩小的图片仅仅使用大概0.75MB的内存,如果是加载完整尺寸的图片,那么大概需要花费12MB(前提都是Bitmap的配置是 ARGB_8888)。根据目标图片大小来计算Sample图片大小的代码示例:public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize;}
为了使用该方法,首先需要设置 inJustDecodeBounds 为 true
, 把options的值传递过来,然后设置inSampleSize 的值并设置 inJustDecodeBounds 为 false
,之后重新调用相关的解码方法。
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options);}
使用上面这个方法可以简单地加载一张任意大小的图片。如下面的代码样例显示了一个接近 100x100像素的缩略图:
mImageView.setImageBitmap( decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));
我们可以通过替换合适的BitmapFactory.decode* 方法来实现一个类似的方法,从其他的数据源解析Bitmap。
- 高效加载大图(官方例子)
- 高效加载大图片
- android 高效加载大图
- 高效加载大图片
- android高效加载大图
- 高效加载大图
- 高效加载大图
- Android高效加载大图
- 高效加载大图
- 高效加载大图片
- 高效加载大图
- Android 大图预览、高效大图加载
- Android 高效加载大图片
- Android 高效加载大图片
- Android 高效加载大图片
- Android 高效加载大图片
- Android高效加载一张大图
- android图片:高效加载大图
- PHP中 的全局变量$_SERVER
- Lua检查非空
- 常用算法——希尔排序(Shell Sort)
- Lua消息处理集合
- ZOJ-2850-Beautiful Meadow【暴力】【4th浙江省赛】
- 高效加载大图(官方例子)
- 说明
- poj1009
- 小小笔记2
- POJ【数论/组合/博弈论】题目列表
- android学习之路(第一天)-开发环境
- 【React Native开发】React Native控件之Switch开关与Picker选择器组件讲解以及使用(16)
- CF 4A Watermelon
- B/S总结--前台攻略--JS