簡單的上傳頭像圖片(使用bitmap)
阿新 • • 發佈:2019-02-14
很多東西,你記得的時候怎麼用都沒問題,可當你長時間的擱置之後,熟練的使用就沒有這麼簡單了,簡單的使用bitmap上傳圖片的方法。(僅供參考,以防忘記,特此記錄)
1.因為方法很簡單這個就只activity原始碼,佈局就不貼了
package com.example.updateicon; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Paint; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.File; public class MainActivity extends AppCompatActivity { private Button button; protected static final int CHOOSE_PICTURE = 0; protected static final int TAKE_PICTURE = 1; private static final int CROP_SMALL_PICTURE = 2; protected static Uri tempUri; private Bitmap photo; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { button=findViewById(R.id.button); imageView=findViewById(R.id.iv_image); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showChoosePicDialog(); } }); } private void showChoosePicDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("設定頭像"); String[] items = {"選擇本地照片", "拍照"}; builder.setNegativeButton("取消", null); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case CHOOSE_PICTURE: // 選擇本地照片 Intent openAlbumIntent = new Intent( Intent.ACTION_PICK); openAlbumIntent.setType("image/*"); startActivityForResult(openAlbumIntent, CHOOSE_PICTURE); break; case TAKE_PICTURE: // 拍照 Intent openCameraIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); tempUri = Uri.fromFile(new File(Environment .getExternalStorageDirectory(), "image.jpg")); // 指定照片儲存路徑(SD卡),image.jpg為一個臨時檔案,每次拍照後這個圖片都會被替換 openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri); startActivityForResult(openCameraIntent, TAKE_PICTURE); break; } } }); builder.create().show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { // 如果返回碼是可以用的 switch (requestCode) { case TAKE_PICTURE: startPhotoZoom(tempUri); // 開始對圖片進行裁剪處理 break; case CHOOSE_PICTURE: startPhotoZoom(data.getData()); // 開始對圖片進行裁剪處理 break; case CROP_SMALL_PICTURE: if (data != null) { setImageToView(data); // 讓剛才選擇裁剪得到的圖片顯示在介面上 } break; } } } //裁剪圖片的實現 protected void startPhotoZoom(Uri uri) { if (uri == null) { Log.i("tag", "The uri is not exist."); } tempUri = uri; Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 設定裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, CROP_SMALL_PICTURE); } protected void setImageToView(Intent data) { Bundle extras = data.getExtras(); if (extras != null) { photo = extras.getParcelable("data"); photo=transform(photo); imageView.setImageBitmap(photo); } } public Bitmap transform(Bitmap source) { int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); if (squaredBitmap != source) { source.recycle(); } Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); paint.setShader(shader); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); squaredBitmap.recycle(); return bitmap; } }
上效果圖: