1. 程式人生 > >在子執行緒中進行二次取樣

在子執行緒中進行二次取樣

個人整理思路:

				1.獲取相簿中圖片,得到圖片的路徑
                 2.獲取儲存圖片設定的邊框的寬高,
                        與原有寬高計算出縮放比例----第一次取樣只讀取圖片,不載入到記憶體
                 3.將圖片載入到記憶體中-----第二次取樣
                 4.得到bitmap,放入到指定邊框

基類:

	package com.example.twosampling;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
		 //抽象的
public abstract class BaseActivity extends AppCompatActivity {
   @Override
	   public void onCreate( @Nullable Bundle savedInstanceState) {
  		  super.onCreate(savedInstanceState);
 			   //設定內容檢視
 			   setContentView(getLayoutResId());
		    //初始化view
 			   initView();
 		   //初始化資料
  		  initData();

  }

    //初始化內容檢視
protected abstract int getLayoutResId();
//初始化檢視
    protected abstract void initView();
   // 初始化資料
    protected abstract void initData();

}

MainActivity

package com.example.twosampling;

import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.content.CursorLoader;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends BaseActivity {
//定義變數
private Button choose,produce;
private EditText edit_wide,edit_high;
private ImageView image;
private Uri uri;

@Override
protected int getLayoutResId() {
    return R.layout.activity_main;
}

@Override   //檢視
protected void initView() {
    //獲取資源ID
    choose=findViewById(R.id.choose);
    produce=findViewById(R.id.produce);
    edit_wide=findViewById(R.id.edit_wide);
    edit_high=findViewById(R.id.edit_high);
    image=findViewById(R.id.image);

}

@Override       //資料載入
protected void initData() {
    //選擇按鈕點選獲取圖片
    choose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //開啟系統相簿
            Intent it=new Intent(Intent.ACTION_PICK);
            //設定型別
            it.setType("image/*");
            //回傳值
            startActivityForResult(it,100);
        }
    });
    //二次取樣
    produce.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //得到輸入框的值
            String w = edit_wide.getText().toString();
            String h = edit_high.getText().toString();
            //得到真實的路徑
            String url = getUrl(uri);
            NetUtile.getInstance().getBitmap2(url, Integer.parseInt(w), Integer.parseInt(h), new NetUtile.CallBack<Bitmap>() {
                @Override
                public void onsuccess(Bitmap bitmap) {
                    image.setImageBitmap(bitmap);
                }
            });
        }
    });

}
//獲取檔案對應的真實路徑----固定格式
private String getUrl(Uri contentUri ){
    String[] pr = {MediaStore.Images.Media.DATA};
    CursorLoader loader = new CursorLoader(this, contentUri, pr, null, null, null);
    Cursor cursor = loader.loadInBackground();
    int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(index);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode==100&&resultCode==RESULT_OK){
      uri = data.getData();//得到圖片的uri------二次取樣用到圖片的路徑
    }
}

}

工具類

package com.example.twosampling;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

public class NetUtile {
private static NetUtile instance;
private NetUtile(){

}
public static NetUtile getInstance(){
    if (instance==null){
        instance=new NetUtile();
    }
    return instance;
}

//圖片的二次取樣               //要載入的圖片路徑   控制元件中圖片的寬、高
    public Bitmap getBitmap(String filePath,int destWidth,int destHeight){
        //第一次************
        BitmapFactory.Options options = new BitmapFactory.Options();
       //指定只解析bitmap的寬高資訊,只讀取圖片,不載入到記憶體
       options.inJustDecodeBounds=true;
        BitmapFactory.decodeFile(filePath,options);
        //獲得原圖的寬和高
        int outWidth = options.outWidth;
        int outHeight = options.outHeight;
        //定義縮放比例---2的n次方
       options.inSampleSize=Math.max(outWidth/destWidth,outHeight/destHeight);
       //第二次************    圖片載入到記憶體
        options.inJustDecodeBounds=false;
        Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);

        return bitmap;
    }

  //定義介面

public interface CallBack<Bitmap>{
    void onsuccess(Bitmap bitmap);
}

//子執行緒
@SuppressLint("StaticFieldLeak")
public void getBitmap2(String filepath, final int destwidth, final int destheight, final  CallBack callBack){    //返回值Bitmap
    new AsyncTask<String, Void, Bitmap>() {
        @Override
        protected Bitmap doInBackground(String... strings) {
            Bitmap bitmap = getBitmap(strings[0], destwidth, destheight);
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            callBack.onsuccess(bitmap);
        }
    }.execute(filepath);//根據圖片的路徑
}

}

xml佈局:

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout xmlns:android=“http://schemas.android.com/apk/res/android
xmlns:app=“http://schemas.android.com/apk/res-auto
xmlns:tools=“http://schemas.android.com/tools
android:layout_width=“match_parent”
android:layout_height=“match_parent”
tools:context=".MainActivity">

<TextView
    android:id="@+id/wide"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="寬"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toBottomOf="@id/choose"
    android:padding="40dp"
    android:textSize="20dp"
    />
<EditText
    android:id="@+id/edit_wide"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@id/choose"
    app:layout_constraintLeft_toRightOf="@id/wide"
    android:padding="20dp"
    />
<TextView
    android:id="@+id/high"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="高"
    android:textSize="20dp"
    app:layout_constraintLeft_toRightOf="@id/edit_wide"
    app:layout_constraintTop_toBottomOf="@id/choose"
    android:padding="40dp"
    />
<EditText
    android:id="@+id/edit_high"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="20dp"
    app:layout_constraintLeft_toRightOf="@id/high"
    app:layout_constraintTop_toBottomOf="@id/choose"
    />

<Button
    android:id="@+id/produce"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="生成"
    app:layout_constraintTop_toBottomOf="@id/edit_wide"
    android:layout_margin="20dp"
    />
<ImageView
    android:id="@+id/image"
    android:layout_width="150dp"
    android:layout_height="150dp"
    app:layout_constraintTop_toBottomOf="@id/produce"
    android:layout_margin="40dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    />

</android.support.constraint.ConstraintLayout>

許可權----讀和寫: