Bitmap_二次采样

一.首先我们先来了解一下什么是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" />

搞定,希望可以给正在阅读的朋友们带来帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值