直播平臺搭建,Android手機拍照和手機相簿選取圖片的工具
直播平臺搭建,Android手機拍照和手機相簿選取圖片的工具
package com.shentaiwang.jsz.savepatient.util; import android.app.Activity; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.util.DisplayMetrics; import android.util.Log; import android.view.WindowManager; import android.widget.Toast; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; /** * Created by user on 2016/12/16. */ public class ImageUtil { public static final int CODE_SETHDIMG_ALNUM = 1; public static final int CODE_SETHDIMG_CAM = 2; public static final int CROP_IMG = 100; public File camImgFile = null; public File cropImgFile = null; public void gotoCam(Context context) { try { //獲取當前系統的android版本號 int currentApiVersion = android.os.Build.VERSION.SDK_INT; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()); String str = dateFormat.format(new Date(System.currentTimeMillis())); //設定儲存拍攝照片路徑(DCIM/Camera/Modle_PictureWall_img_20170212_122223.jpg) //路徑預設,若修改則不能儲存照片 camImgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "/Camera/Modle_PictureWall_img_" + str + ".jpg"); Uri outputImgUriFromCam = null; if (currentApiVersion < 24) { outputImgUriFromCam = Uri.fromFile(camImgFile); } else { ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, camImgFile.getAbsolutePath()); outputImgUriFromCam = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); } //跳轉到照相機拍照 Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); it.putExtra(MediaStore.EXTRA_OUTPUT, outputImgUriFromCam); ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_CAM); // startActivityForResult(it,CODE_SETHDIMG_CAM); }catch (Exception e){ Toast.makeText(context,"請開啟攝像許可權",Toast.LENGTH_SHORT).show(); } } public void gotoAlbum(Context context) { Intent it = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_ALNUM); // startActivityForResult(it,CODE_SETHDIMG_ALNUM); } public void cropImg(Context context, boolean isFromCam, boolean isSetHd, Intent data, String fileName) { File inputFile = null; if (isFromCam) { inputFile = camImgFile; } else { Log.d("ImageUtil", "cropImg:圖片資料: "+data.getData()); inputFile = new File(getRealPathFromURI(context, data.getData())); } //設定儲存路徑名稱 cropImgFile = new File(context.getExternalFilesDir(fileName), String.valueOf(System.currentTimeMillis())); WindowManager manager = ((Activity) context).getWindowManager(); DisplayMetrics outMetrics = new DisplayMetrics(); manager.getDefaultDisplay().getMetrics(outMetrics); Intent it = new Intent("com.android.camera.action.CROP"); it.setDataAndType(getImageContentUri(context, inputFile), "image/*"); it.putExtra("output", Uri.fromFile(cropImgFile)); it.putExtra("crop", "true"); it .putExtra("scale",true);//黑邊 it .putExtra("scaleUpIfNeeded",true);//黑邊 if (isSetHd) { // 裁剪框比例 it.putExtra("aspectX", 1); it.putExtra("aspectY", 1); // 輸出圖片大小 it.putExtra("outputX", outMetrics.widthPixels / 2); it.putExtra("outputY", outMetrics.widthPixels / 2); } else { // 裁剪框比例 it.putExtra("aspectX", 3); it.putExtra("aspectY", 2); // 輸出圖片大小 it.putExtra("outputX", 600); it.putExtra("outputY", 400); } // 返回格式 it.putExtra("outputFormat", "JPEG"); ((Activity) context).startActivityForResult(it, CROP_IMG); // startActivityForResult(it, CROP_IMG); } public String getRealPathFromURI(Context context, Uri uri) { String mImgPath; String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null); if(cursor!=null){ cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); mImgPath=picturePath; }else{ mImgPath=uri.getPath(); } return mImgPath; } public Uri getImageContentUri(Context context, File imageFile) { String filePath = imageFile.getAbsolutePath(); Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{"_id"}, "_data=? ", new String[]{filePath}, (String) null); if (cursor != null && cursor.moveToFirst()) { int values1 = cursor.getInt(cursor.getColumnIndex("_id")); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + values1); } else if (imageFile.exists()) { ContentValues values = new ContentValues(); values.put("_data", filePath); return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } public void refreshAlbum(Context context, String path) { context.sendBroadcast(new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE", Uri.parse("file://" + path))); } public static byte[] bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } /** * 根據byte陣列生成檔案 * * @param bytes 生成檔案用到的byte陣列 */ public static boolean createFileWithByte(byte[] bytes) { String fileName = "portrait.png"; // TODO Auto-generated method stub /** * 建立File物件,其中包含檔案所在的目錄以及檔案的命名 * */ if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判斷SDCard進行操作 //獲取SDCard指定目錄下 String sdCardDir = Environment.getExternalStorageDirectory() + "/CropImage/"; File dirFile = new File(sdCardDir);//目錄轉換成資料夾 if (!dirFile.exists()) {//如果不存在,就建立這個資料夾 dirFile.mkdir(); } File file = new File(sdCardDir, fileName); // 建立FileOutputStream物件 FileOutputStream outputStream = null; // 建立BufferedOutputStream物件 BufferedOutputStream bufferedOutputStream = null; try { // 如果檔案存在則刪除 if (file.exists()) { file.delete(); } // 在檔案系統中根據路徑建立一個新的空檔案 file.createNewFile(); // 獲取FileOutputStream物件 outputStream = new FileOutputStream(file); // 獲取BufferedOutputStream物件 bufferedOutputStream = new BufferedOutputStream(outputStream); // 往檔案所在的緩衝輸出流中寫byte資料 bufferedOutputStream.write(bytes); // 刷出緩衝輸出流,該步很關鍵,要是不執行flush()方法,那麼檔案的內容是空的。 bufferedOutputStream.flush(); } catch (Exception e) { // 列印異常資訊 e.printStackTrace(); } finally { // 關閉建立的流物件 if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufferedOutputStream != null) { try { bufferedOutputStream.close(); } catch (Exception e2) { e2.printStackTrace(); } } } return true; } return false; } /** * 獲取檔案路徑並轉換成Bitmap * * @param filepath * @return */ public static Bitmap getFilePath(String filepath) { File file = new File(filepath); Bitmap bm = null; if (file.exists()) { bm = BitmapFactory.decodeFile(filepath); } return bm; } public static Bitmap Bytes2Bitmap(byte[] bytes) { if (bytes.length != 0) { return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } else { return null; } } public static Bitmap toRoundCorner(Bitmap bitmap, float ratio) {//把正方形圖片轉化為圓形,ratio為2 Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); canvas.drawRoundRect(rectF, bitmap.getWidth() / ratio, bitmap.getHeight() / ratio, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) width / w); float scaleHeight = ((float) height / h); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; } public static String savePhotoToSDCard(Bitmap bitmap) { String photoName = ""; if (checkSDCardAvailable()) { // 圖片時間命名 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(System.currentTimeMillis()); photoName = format.format(date); // 儲存至DCIM資料夾下 File dir = new File(Environment .getExternalStorageDirectory() + "/Stw/temp/save/"); if (!dir.exists()) { dir.mkdirs(); } File photoFile = new File(dir.getAbsolutePath(), photoName + ".png"); Bitmap photoBitmap = bitmap; // FileOutputStream fileOutputStream = null; // try { // fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { // double maxSize = 400.00; // 將bitmap放至陣列中,意在bitmap的大小(與實際讀取的原檔案要大) ByteArrayOutputStream baos = new ByteArrayOutputStream(); photoBitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); int options = 80;//先壓縮到80% while (baos.toByteArray().length / 1024 > 200) { // 迴圈判斷如果壓縮後圖片是否大於200kb,大於繼續壓縮 if (options <= 0) {//有的圖片過大,可能當options小於或者等於0時,它的大小還是大於目標大小,於是就會發生異常,異常的原因是options超過規定值。所以此處需要判斷一下 break; } baos.reset();// 重置baos即清空baos options -= 10;// 每次都減少10 bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos); } // byte[] b = baos.toByteArray(); // // 將位元組換成KB // double mid = b.length / 1024; // // 判斷bitmap佔用空間是否大於允許空間 如果大於則壓小於則不壓縮 // if (mid > maxSize) { // // 獲取bitmap大小 是允許最大大小的多少 // double i = mid / maxSize; // // 壓縮 此處用到平方將寬頻和高度壓縮掉對應的平方根 // // 保持刻度和高度和原bitmap比率,壓縮後也達到了大小佔用空間的大小) // photoBitmap = zoomImage(photoBitmap, // photoBitmap.getWidth() / Math.sqrt(i), // photoBitmap.getHeight() / Math.sqrt(i)); // } // if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, // fileOutputStream)) { // fileOutputStream.flush(); // // fileOutputStream.close(); // } try { FileOutputStream fos = new FileOutputStream(photoFile); fos.write(baos.toByteArray()); fos.close(); baos.close(); return photoFile.getAbsolutePath(); } catch (Exception e) { } } // } catch (FileNotFoundException e) { // photoFile.delete(); // e.printStackTrace(); // } catch (IOException e) { // photoFile.delete(); // e.printStackTrace(); // } finally { // try { // if (fileOutputStream != null) { // fileOutputStream.close(); // } // } catch (IOException e) { // e.printStackTrace(); // } // } } return null; } /** * 壓縮圖片 */ public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) { // 獲取這個圖片的寬和高 float width = bgimage.getWidth(); float height = bgimage.getHeight(); // 建立操作圖片用的matrix物件 Matrix matrix = new Matrix(); // 計算寬高縮放�? float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 縮放圖片動作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, (int) height, matrix, true); return bitmap; } //檢查sd卡是否存在 public static boolean checkSDCardAvailable() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } }
以上就是直播平臺搭建,Android手機拍照和手機相簿選取圖片的工具, 更多內容歡迎關注之後的文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2932290/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 直播平臺軟體開發,Android 10 拍照和相簿選擇Android
- Android 從手機相簿獲取圖片 uri 路徑 從相機獲取照片Android
- 直播app開發搭建,ios 獲取手機中所有圖片APPiOS
- Android 呼叫系統相機拍照 . 選取本地相簿Android
- Android上傳圖片之呼叫系統拍照和從相簿選擇圖片Android
- 手機直播平臺開發的解析
- Android 拍照及相簿選取圖片功能,已適配Android6.0、7.0、8.0Android
- Android本地圖片上傳(拍照+相簿)Android地圖
- Android呼叫系統相簿和相機拍照Android
- Android 圓形頭像 相簿和拍照裁剪選取Android
- 微信小程式開發之從相簿獲取圖片 使用相機拍照 本地圖片上傳微信小程式地圖
- 仿微信圖片選取、相機拍照—PhotoPicker(已整合GalleryView)View
- Android拍照,相簿選擇圖片以及Android6.0許可權管理Android
- 解決android有的手機拍照後上傳圖片被旋轉的問題Android
- 直播平臺搭建,實現圖片縮圖功能
- Android 從本地選取圖片或者拍照填充ImageViewAndroidView
- 魚羊兒教您搭建手機直播APP平臺!直播系統原始碼開發!APP原始碼
- Android中使用封裝的OKHttp上傳圖片,從相機和相簿中獲取圖片並剪下Android封裝HTTP
- iPhone手機和Android手機的對比iPhoneAndroid
- 直播平臺搭建原始碼,java相簿製作原始碼Java
- ios手機豎屏拍照圖片旋轉90°問題解決方法iOS
- Swift相簿選擇和拍照功能Swift
- android獲取手機ipAndroid
- Android 拍照、選擇圖片並裁剪Android
- 手機直播原始碼,實現圖片瀑布流式滑動效果原始碼
- 手機直播原始碼,android 輪播圖自定製元件原始碼Android元件
- 手機直播軟體系統搭建原始碼,聚合採集器採集平臺介面!原始碼
- 直播平臺搭建原始碼,更改圖片透明度原始碼
- 直播原始碼搭建教程之獲取相簿中的指定一個圖片後上傳原始碼
- android 獲取手機號碼Android
- Android獲取手機配置資訊Android
- 搭建直播平臺,android 如何得到本地影片的縮圖Android
- php+html5相容手機端的圖片選取裁剪上傳例項PHPHTML
- android實現拍照、相簿選圖、裁剪功能,相容7.0以及小米Android
- 求一個手機多選上傳圖片的好外掛
- Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示Android
- 手機如何提取圖片中的文字、拍照識別文字的操作
- 直播APP手機收集APP