在子執行緒中進行二次取樣
個人整理思路:
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>