一.首先我们先来了解一下什么是Bitmap二次采样:
BitmapFactory内部的图片解码,形成Bitmap是通过底层C/C++来实现的,有专门的图片界面库,可以通过参数来获取图片的尺寸,以及设置针对颜色加载的采样比率,采样比率就是把多个像素采样成一个像素,图片自然就变小了,最终传递给Java级别的对象,内存就变小了,图片也就变小了。
二.其次我们为什么要进行二次采样:
1.主要是避免OOM。
内存溢出(即OOM,out of memory)。
2.假设客户端需要加载一张图片,图片尺寸为3000*3000(单位/像素),那么计算一下,如果客户端想显示原图,按一个像素四个字节算, 3000 * 3000 * 4 / 1024 / 1024 = 34 M,想想看客户端一个应用程序的运行内存就十几M,你一下显示一个30多M的图片,直接crash了。
3.
三 .二次采样分为哪两次:
第一次:
在加载网络、文件的图片时,进行图片的解码BitmapFactory.decode(),只进行图片的尺寸获取,不进行实际的Bitmap创建,因此,第一次解码,不会占用太多的内存,可以获取图片的宽和高;
第二次:
根据图片真实的宽高,以及客户端希望图片加载后的尺寸,进行一个计算,形成一种图片解码时缩小采样的一个数值,这个数值,可以直接运用在BitmapFactory上,加载到内存的Bitmap,就是变小的,内存是小图片的内容,不是原始图片的内存;
四.通过Bitmap二次采样能够给我们带来什么好处:
那么最直接的好处肯定就是解决了OOM(内存溢出)的问题了.
其次呐就是节省了用户的内存控件,提高运行效率,增强用户体验.
好了,那么接下来我们通过代码来看一下,我们应该如何操作
MainActivity:
package com.example.doublesampling;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import java.io.File;
import static android.os.Environment.DIRECTORY_DOWNLOADS;
public class MainActivity extends AppCompatActivity {
private ImageView icon;
private File file;
private ImageView icon_center;
private ImageView icon_bottom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//100M
setContentView(R.layout.activity_main);
//初始化控件
initView();
//获得图片路径
file = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS), "world.jpg");
//icon.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));
//icon_center.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));
//icon_bottom.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));
//获取模拟器屏幕的宽
//Log.i("TEST", "" + getResources().getDisplayMetrics().widthPixels);
//对图片进行处理
loadBitmap(file);
}
//通过Bitmap进行二次采样
private void loadBitmap(File file) {
BitmapFactory.Options options = new BitmapFactory.Options();
//第一次采样 只获取边框
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
//options.outWidth; options.outHeight;
options.inSampleSize = options.outWidth / 800;
//第二次采样
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
//加载图片
icon.setImageBitmap(bitmap);
icon_center.setImageBitmap(bitmap);
icon_bottom.setImageBitmap(bitmap);
}
//获取资源id
private void initView() {
icon = (ImageView) findViewById(R.id.icon);
icon_center = (ImageView) findViewById(R.id.icon_center);
icon_bottom = (ImageView) findViewById(R.id.icon_bottom);
}
}
<?xml version="1.0" encoding="utf-8"?><ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/icon_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/icon_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
搞定,希望可以给正在阅读的朋友们带来帮助