獲取本地圖片或拍照,進行頭像圖片的上傳的工具類
1. 圖片的獲取,裁剪,壓縮類(可以作為主功能程式碼在Activity中)
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;
/** * 顯示修改頭像的對話方塊 */ public void showChoosePicDialog(View v) { 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_GET_CONTENT); openAlbumIntent.setType("image/*"); startActivityForResult(openAlbumIntent, CHOOSE_PICTURE); break; case TAKE_PICTURE: // 拍照 takePicture(); break; } } }); builder.create().show(); } private void takePicture() { String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (Build.VERSION.SDK_INT >= 23) { // 需要申請動態許可權 int check = ContextCompat.checkSelfPermission(this, permissions[0]); // 許可權是否已經 授權 GRANTED---授權 DINIED---拒絕 if (check != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } } Intent openCameraIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment .getExternalStorageDirectory(), "image.jpg"); //判斷是否是AndroidN以及更高的版本 if (Build.VERSION.SDK_INT >= 24) { openCameraIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); tempUri = FileProvider.getUriForFile(PersonInfoActivity.this, "com.lt.uploadpicdemo.fileProvider", file); } else { tempUri = Uri.fromFile(new File(Environment .getExternalStorageDirectory(), "image.jpg")); } // 指定照片儲存路徑(SD卡),image.jpg為一個臨時檔案,每次拍照後這個圖片都會被替換 openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri); startActivityForResult(openCameraIntent, TAKE_PICTURE); } @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; } } } /** * 裁剪圖片方法實現 * * @param uri */ 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); } /** * 儲存裁剪之後的圖片資料 * * @param */ protected void setImageToView(Intent data) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); photo = ImageUtils.toRoundBitmap(photo); // 這個時候的圖片已經被處理成圓形的了 headPhoto.setImageBitmap(photo); uploadPic(photo); } } private void uploadPic(Bitmap bitmap) { // 上傳至伺服器 // ... 可以在這裡把Bitmap轉換成file,然後得到file的url,做檔案上傳操作 // 注意這裡得到的圖片已經是圓形圖片了 // bitmap是沒有做個圓形處理的,但已經被裁剪了 String imagePath = ImageUtils.savePhoto(bitmap, Environment .getExternalStorageDirectory().getAbsolutePath(), String .valueOf(System.currentTimeMillis())); Log.e("imagePath", imagePath+""); if(imagePath != null){ // 拿著imagePath上傳了 Log.d("TAG","imagePath:"+imagePath); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { // 沒有獲取 到許可權,從新請求,或者關閉app Toast.makeText(this, "需要儲存許可權", Toast.LENGTH_SHORT).show(); } }
2. 圖片的上傳及轉換類(可以作為util工具類)
import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; //上傳頭像 public class ImageUtils { /** * Save image to the SD card * * @param photoBitmap * @param photoName * @param path */ public static String savePhoto(Bitmap photoBitmap, String path, String photoName) { String localPath = null; if (android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } File photoFile = new File(path, photoName + ".png"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) { // 轉換完成 localPath = photoFile.getPath(); fileOutputStream.flush(); } } } catch (FileNotFoundException e) { photoFile.delete(); localPath = null; e.printStackTrace(); } catch (IOException e) { photoFile.delete(); localPath = null; e.printStackTrace(); } finally { try { if (fileOutputStream != null) { fileOutputStream.close(); fileOutputStream = null; } } catch (IOException e) { e.printStackTrace(); } } } return localPath; } /** * 轉換圖片成圓形 * * @param bitmap 傳入Bitmap物件 * @return */ public static Bitmap toRoundBitmap(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); float roundPx; float left,top,right,bottom,dst_left,dst_top,dst_right,dst_bottom; if (width <= height) { roundPx = width / 2; top = 0; bottom = width; left = 0; right = width; height = width; dst_left = 0; dst_top = 0; dst_right = width; dst_bottom = width; } else { roundPx = height / 2; float clip = (width - height) / 2; left = clip; right = width - clip; top = 0; bottom = height; width = height; dst_left = 0; dst_top = 0; dst_right = height; dst_bottom = height; } Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom); final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom); final RectF rectF = new RectF(dst); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, src, dst, paint); return output; } }
相關文章
- 微信小程式開發之從相簿獲取圖片 使用相機拍照 本地圖片上傳微信小程式地圖
- Android本地圖片上傳(拍照+相簿)Android地圖
- WebRTC從攝像頭獲取圖片傳入canvasWebCanvas
- laravel圖片/頭像上傳通用方法Laravel
- vue 上傳圖片進行壓縮圖片Vue
- android選擇圖片或拍照圖片上傳到伺服器(包括上傳引數)Android伺服器
- Android圖片上傳(頭像裁切+原圖原樣)Android
- 獲取本地圖片/視訊地圖
- canvas 繪製的圖片,進行上傳Canvas
- PHP上傳圖片類PHP
- 擷取圖片生成頭像外掛
- 微信小程式-拍照或選擇圖片並上傳檔案微信小程式
- java,springboot + thymeleaf 上傳圖片、刪除圖片到伺服器、本地,壓縮圖片上傳(有些圖片會失真),原圖上傳JavaSpring Boot伺服器
- Python基於opencv呼叫攝像頭獲取個人圖片PythonOpenCV
- 讀取本地圖片地圖
- Android 從本地選取圖片或者拍照填充ImageViewAndroidView
- 利用微信公眾號提供的官方API上傳圖片獲取永久圖片素材!當圖床用!API圖床
- 用python寫個爬取指定網址上所有圖片,並能根據獲取到的圖片網址,進入網址,再次進行圖片獲取 的程式碼指令碼Python指令碼
- 上傳圖片
- Android上傳圖片之呼叫系統拍照和從相簿選擇圖片Android
- 圖片上傳及圖片處理
- cropper,圖片剪輯上傳工具的使用
- 使用tinypng對需要上傳Gitee圖床的圖片進行壓縮Gitee圖床
- 獲取app 圖片APP
- jQuery圖片上傳前先在本地預覽jQuery
- PbootCMS上傳圖片變模糊、上傳圖片尺寸受限的解決方案boot
- php圖片上傳之圖片轉換PHP
- curl上傳圖片的大坑
- Retrofit+RxJava上傳圖片上傳圖片到後臺RxJava
- 獲取SD卡上所有的圖片SD卡
- 短視訊平臺搭建,圖片進行預覽上傳、刪除,讀取本地檔案
- 【easyui 】上傳圖片UI
- 上傳圖片jsJS
- 圖片切割工具類
- Android中使用封裝的OKHttp上傳圖片,從相機和相簿中獲取圖片並剪下Android封裝HTTP
- 獲取網路圖片的大小
- javascript如何獲取圖片的高度JavaScript
- 獲取SDWebImage下載的圖片Web