Android之本地相册图片选取和拍照以及图片剪辑
来源:互联网 发布:mac支持flash吗 编辑:程序博客网 时间:2024/05/21 14:01
转载请注明出处:http://blog.csdn.net/loveyaozu/article/details/51160482
相信有很多Android开发人员在日常开发中,由于项目需求,需要我们的APP能够从相册中选取图片并剪辑,以及拍照剪辑后上传的功能。如果之前你没有做过这个功能,刚开始做的时候可能会遇到一些列的问题,这些问题大多是细节上的问题。今天,就根据自己的开发经验,给大家提供一套完成的相册图片选取剪辑和拍照剪辑的代码事例。我提供的代码可能还会存在一些问题,大家可以相互交流学习。
这里会给大家提供一些我整理的一些图片处理的工具类,供大家使用。
拍照,相册图片选取以及图片剪辑的工具类,PhotoUtils.java
package com.syz.photograph;import java.io.File;import java.lang.ref.WeakReference;import java.text.SimpleDateFormat;import java.util.Date;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.support.v4.app.Fragment;public class PhotoUtil {public static final int NONE = 0;public static final String IMAGE_UNSPECIFIED = "image/*";//任意图片类型public static final int PHOTOGRAPH = 1;// 拍照public static final int PHOTOZOOM = 2; // 缩放public static final int PHOTORESOULT = 3;// 结果public static final int PICTURE_HEIGHT = 500;public static final int PICTURE_WIDTH = 500;public static String imageName;/** * 从系统相册中选取照片上传 * @param activity */public static void selectPictureFromAlbum(Activity activity){// 调用系统的相册Intent intent = new Intent(Intent.ACTION_PICK, null);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,IMAGE_UNSPECIFIED);// 调用剪切功能activity.startActivityForResult(intent, PHOTOZOOM);}/** * 从系统相册中选取照片上传 * @param fragment */public static void selectPictureFromAlbum(Fragment fragment){// 调用系统的相册Intent intent = new Intent(Intent.ACTION_PICK, null);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,IMAGE_UNSPECIFIED);// 调用剪切功能fragment.startActivityForResult(intent, PHOTOZOOM);}/** * 拍照 * @param activity */public static void photograph(Activity activity){imageName = File.separator + getStringToday() + ".jpg";// 调用系统的拍照功能Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);String status = Environment.getExternalStorageState();if(status.equals(Environment.MEDIA_MOUNTED)){intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), imageName)));}else{intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(activity.getFilesDir(), imageName)));}activity.startActivityForResult(intent, PHOTOGRAPH);}/** * 拍照 * @param fragment */public static void photograph(Fragment fragment){imageName = "/" + getStringToday() + ".jpg";// 调用系统的拍照功能Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);String status = Environment.getExternalStorageState();if(status.equals(Environment.MEDIA_MOUNTED)){intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), imageName)));}else{intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(fragment.getActivity().getFilesDir(), imageName)));}fragment.startActivityForResult(intent, PHOTOGRAPH);}/** * 图片裁剪 * @param activity * @param uri * @param height * @param width */public static void startPhotoZoom(Activity activity,Uri uri,int height,int width) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, IMAGE_UNSPECIFIED);intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", height);intent.putExtra("outputY", width);intent.putExtra("noFaceDetection", true); //关闭人脸检测intent.putExtra("return-data", true);//如果设为true则返回bitmapintent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//输出文件intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());activity.startActivityForResult(intent, PHOTORESOULT);}/** * 图片裁剪 * @param activity * @param uri 原图的地址 * @param height 指定的剪辑图片的高 * @param width 指定的剪辑图片的宽 * @param destUri 剪辑后的图片存放地址 */public static void startPhotoZoom(Activity activity,Uri uri,int height,int width,Uri destUri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, IMAGE_UNSPECIFIED);intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", height);intent.putExtra("outputY", width);intent.putExtra("noFaceDetection", true); //关闭人脸检测intent.putExtra("return-data", false);//如果设为true则返回bitmapintent.putExtra(MediaStore.EXTRA_OUTPUT, destUri);//输出文件intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());activity.startActivityForResult(intent, PHOTORESOULT);}/** * 图片裁剪 * @param fragment * @param uri * @param height * @param width */public static void startPhotoZoom(Fragment fragment,Uri uri,int height,int width) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, IMAGE_UNSPECIFIED);intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", height);intent.putExtra("outputY", width);intent.putExtra("return-data", true);fragment.startActivityForResult(intent, PHOTORESOULT);}/** * 获取当前系统时间并格式化 * @return */@SuppressLint("SimpleDateFormat")public static String getStringToday() {Date currentTime = new Date();SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");String dateString = formatter.format(currentTime);return dateString;}/** * 制作图片的路径地址 * @param context * @return */ public static String getPath(Context context){ String path = null; File file = null; long tag = System.currentTimeMillis(); if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ //SDCard是否可用 path = Environment.getExternalStorageDirectory() + File.separator +"myimages/"; file = new File(path); if(!file.exists()){ file.mkdirs(); } path = Environment.getExternalStorageDirectory() + File.separator +"myimages/"+ tag + ".png"; }else{ path = context.getFilesDir() + File.separator +"myimages/"; file = new File(path); if(!file.exists()){ file.mkdirs(); } path = context.getFilesDir() + File.separator +"myimages/"+ tag + ".png"; }return path; } /** * 按比例获取bitmap * @param path * @param w * @param h * @return */ public static Bitmap convertToBitmap(String path, int w, int h) { BitmapFactory.Options opts = new BitmapFactory.Options(); // 设置为ture只获取图片大小 opts.inJustDecodeBounds = true; opts.inPreferredConfig = Bitmap.Config.ARGB_8888; BitmapFactory.decodeFile(path, opts); int width = opts.outWidth; int height = opts.outHeight; float scaleWidth = 0.f, scaleHeight = 0.f; if (width > w || height > h) { // 缩放 scaleWidth = ((float) width) / w; scaleHeight = ((float) height) / h; } opts.inJustDecodeBounds = false; float scale = Math.max(scaleWidth, scaleHeight); opts.inSampleSize = (int)scale; WeakReference<Bitmap> weak = new WeakReference<Bitmap>(BitmapFactory.decodeFile(path, opts)); return Bitmap.createScaledBitmap(weak.get(), w, h, true); } /** * 获取原图bitmap * @param path * @return */ public static Bitmap convertToBitmap2(String path) { BitmapFactory.Options opts = new BitmapFactory.Options(); // 设置为ture只获取图片大小 opts.inJustDecodeBounds = true; opts.inPreferredConfig = Bitmap.Config.ARGB_8888; // 返回为空 BitmapFactory.decodeFile(path, opts); return BitmapFactory.decodeFile(path, opts); }}
图片压缩等一些列图片处理的工具类 ImageUtils.java
package com.syz.photograph;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import android.content.ContentValues;import android.content.Context;import android.content.res.Resources;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.media.ExifInterface;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.util.Log;/** * 图片处理的工具类 * @author yaozu * */public class ImageUtils {private static final String TAG = ImageUtils.class.getSimpleName();/** * 根据Uri获取路径 * @param contentUri * @return */public static String getRealPathByURI(Uri contentUri,Context context) {String res = null;String[] proj = { MediaStore.Images.Media.DATA };Cursor cursor = context.getContentResolver().query(contentUri,proj, null, null, null);if (cursor.moveToFirst()) {;int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);res = cursor.getString(column_index);}cursor.close();return res;}/** * 创建一条图片地址uri,用于保存拍照后的照片 * * @param context * @return 图片的uri */public static Uri createImagePathUri(Context context) {Uri imageFilePath = null;String status = Environment.getExternalStorageState();SimpleDateFormat timeFormatter = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA);long time = System.currentTimeMillis();String imageName = timeFormatter.format(new Date(time));// ContentValues是我们希望这条记录被创建时包含的数据信息ContentValues values = new ContentValues(3);values.put(MediaStore.Images.Media.DISPLAY_NAME, imageName);values.put(MediaStore.Images.Media.DATE_TAKEN, time);values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");if (status.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储imageFilePath = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);} else {imageFilePath = context.getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);}Log.i("", "生成的照片输出路径:" + imageFilePath.toString());return imageFilePath;}/** * 图片压缩 * * @param bmp * @param file */public static void compressBmpToFile(File file,int height,int width) {Bitmap bmp = decodeSampledBitmapFromFile(file.getPath(), height, width);ByteArrayOutputStream baos = new ByteArrayOutputStream();int options = 100;bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);/*while (baos.toByteArray().length / 1024 > 30) {baos.reset();if (options - 10 > 0) {options = options - 10;bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);}if (options - 10 <= 0) {break;}}*/try {FileOutputStream fos = new FileOutputStream(file);fos.write(baos.toByteArray());fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}}/** * 将图片变成bitmap * * @param path * @return */public static Bitmap getImageBitmap(String path) {Bitmap bitmap = null;File file = new File(path);if (file.exists()) {bitmap = BitmapFactory.decodeFile(path);return bitmap;}return null;}//=================================图片压缩方法===============================================/** * 质量压缩 * @author ping 2015-1-5 下午1:29:58 * @param image * @param maxkb * @return */ public static Bitmap compressBitmap(Bitmap image,int maxkb) { //L.showlog(压缩图片); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 image.compress(Bitmap.CompressFormat.JPEG, 50, baos); int options = 100; // 循环判断如果压缩后图片是否大于(maxkb)50kb,大于继续压缩 while (baos.toByteArray().length / 1024 > maxkb) { // 重置baos即清空baos baos.reset(); if(options-10>0){ // 每次都减少10 options -= 10; } // 这里压缩options%,把压缩后的数据存放到baos中 image.compress(Bitmap.CompressFormat.JPEG, options, baos); } // 把压缩后的数据baos存放到ByteArrayInputStream中 ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); // 把ByteArrayInputStream数据生成图片 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap; } /** * * @param res * @param resId * @param reqWidth * 所需图片压缩尺寸最小宽度 * @param reqHeight * 所需图片压缩尺寸最小高度 * @return */ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } /** * * @param filepath * 图片路径 * @param reqWidth *所需图片压缩尺寸最小宽度 * @param reqHeight * 所需图片压缩尺寸最小高度 * @return */ public static Bitmap decodeSampledBitmapFromFile(String filepath,int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filepath, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filepath, options); } /** * * @param bitmap * @param reqWidth * 所需图片压缩尺寸最小宽度 * @param reqHeight * 所需图片压缩尺寸最小高度 * @return */ public static Bitmap decodeSampledBitmapFromBitmap(Bitmap bitmap, int reqWidth, int reqHeight) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 90, baos); byte[] data = baos.toByteArray(); final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(data, 0, data.length, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeByteArray(data, 0, data.length, options); } /** * 计算压缩比例值(改进版 by touch_ping) * * 原版2>4>8...倍压缩 * 当前2>3>4...倍压缩 * * @param options * 解析图片的配置信息 * @param reqWidth * 所需图片压缩尺寸最小宽度O * @param reqHeight * 所需图片压缩尺寸最小高度 * @return */ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int picheight = options.outHeight; final int picwidth = options.outWidth; int targetheight = picheight; int targetwidth = picwidth; int inSampleSize = 1; if (targetheight > reqHeight || targetwidth > reqWidth) { while (targetheight >= reqHeight && targetwidth>= reqWidth) { inSampleSize += 1; targetheight = picheight/inSampleSize; targetwidth = picwidth/inSampleSize; } } Log.i("===","最终压缩比例:" +inSampleSize + "倍"); Log.i("===", "新尺寸:" + targetwidth + "*" +targetheight); return inSampleSize; } // 读取图像的旋转度 public static int readBitmapDegree(String path) { int degree = 0; try { ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; } /** * 将图片按照某个角度进行旋转 * * @param bm * 需要旋转的图片 * @param degree * 旋转角度 * @return 旋转后的图片 */ public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) { Bitmap returnBm = null; // 根据旋转角度,生成旋转矩阵 Matrix matrix = new Matrix(); matrix.postRotate(degree); try { // 将原始图片按照旋转矩阵进行旋转,并得到新的图片 returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); } catch (OutOfMemoryError e) { } if (returnBm == null) { returnBm = bm; } if (bm != returnBm) { bm.recycle(); } return returnBm; } /** * * @param mBitmap * @param fileName */ public static void saveBitmapToLocal(Bitmap mBitmap,String fileName) {if(mBitmap != null){FileOutputStream fos = null;try {File file = new File(fileName);if(file.exists()){file.delete();}file.createNewFile();fos = new FileOutputStream(file);mBitmap.compress(Bitmap.CompressFormat.PNG, 80, fos);fos.flush();} catch (Exception e) {e.printStackTrace();}finally{try {if(fos != null){fos.close();}} catch (IOException e) {e.printStackTrace();}}}} /** * 将下载下来的图片保存到SD卡或者本地.并返回图片的路径(包括文件命和扩展名) * @param context * @param bitName * @param mBitmap * @return */public static String saveBitmap(Context context,String bitName, Bitmap mBitmap) {String path = null;File f;if(mBitmap != null){if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){f = new File(Environment.getExternalStorageDirectory() + File.separator +"images/");String fileName = Environment.getExternalStorageDirectory() + File.separator +"images/"+ bitName + ".png";path = fileName;FileOutputStream fos = null;try {if(!f.exists()){f.mkdirs();}File file = new File(fileName);file.createNewFile();fos = new FileOutputStream(file);mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();} catch (Exception e) {e.printStackTrace();}finally{try {if(fos != null){fos.close();}} catch (IOException e) {e.printStackTrace();}}}else{//本地存储路径f = new File(context.getFilesDir() + File.separator +"images/");Log.i(TAG, "本地存储路径:"+context.getFilesDir() + File.separator +"images/"+ bitName + ".png");path = context.getFilesDir() + File.separator +"images/"+ bitName + ".png";FileOutputStream fos = null;try {if(!f.exists()){f.mkdirs();}File file = new File(path);file.createNewFile();fos = new FileOutputStream(file);mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();} catch (IOException e) {e.printStackTrace();}finally{try {if(fos != null){fos.close();}} catch (IOException e) {e.printStackTrace();}}}}return path;}/** * 删除图片 * @param context * @param bitName */public void deleteFile(Context context,String bitName) { if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){File dirFile = new File(Environment.getExternalStorageDirectory() + File.separator + "images/"+ bitName + ".png"); if (!dirFile.exists()) {return;}dirFile.delete();} else {File f = new File(context.getFilesDir() + File.separator+ "images/" + bitName + ".png");if(!f.exists()){return;}f.delete();}}}
这里给大家展示一个简单的拍照,相册图片选取,剪辑图片的例子demo。
首先创建activity_main.xml布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="${relativePackage}.${activityClass}" > <Button android:id="@+id/options" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:gravity="center" android:textSize="15sp" android:text="@string/options_choose" /> <TextView android:id="@+id/small_img_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:textSize="15sp"/> <ImageView android:id="@+id/small_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/app_name" /> <TextView android:id="@+id/clip_pic_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:textSize="15sp"/> <ImageView android:id="@+id/clip_pic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/app_name" /></LinearLayout>
结合上面的PhotoUtils实现拍照,相册图片选取,图片剪辑功能。
MainActivity.java
package com.syz.photograph;import java.io.File;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;import android.widget.TextView;import com.syz.photograph.ActionSheetDialog.OnSheetItemClickListener;import com.syz.photograph.ActionSheetDialog.SheetItemColor;public class MainActivity extends Activity implements OnClickListener {private static final String TAG = MainActivity.class.getSimpleName();private ImageView smallImg;private ImageView clipImg;private TextView tv1,tv2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.options).setOnClickListener(this);initView();}protected void initView() {smallImg = (ImageView) findViewById(R.id.small_img);clipImg = (ImageView) findViewById(R.id.clip_pic);tv1 = (TextView) findViewById(R.id.small_img_title);tv2 = (TextView) findViewById(R.id.clip_pic_title);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.options) {options();}}private String path;@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == PhotoUtil.NONE)return;// 拍照if (requestCode == PhotoUtil.PHOTOGRAPH) {// 设置文件保存路径这里放在跟目录下File picture = null;if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {picture = new File(Environment.getExternalStorageDirectory() + PhotoUtil.imageName);if (!picture.exists()) {picture = new File(Environment.getExternalStorageDirectory() + PhotoUtil.imageName);}} else {picture = new File(this.getFilesDir() + PhotoUtil.imageName);if (!picture.exists()) {picture = new File(MainActivity.this.getFilesDir() + PhotoUtil.imageName);}}path = PhotoUtil.getPath(this);// 生成一个地址用于存放剪辑后的图片if (TextUtils.isEmpty(path)) {Log.e(TAG, "随机生成的用于存放剪辑后的图片的地址失败");return;}Uri imageUri = UriPathUtils.getUri(this, path);PhotoUtil.startPhotoZoom(MainActivity.this, Uri.fromFile(picture), PhotoUtil.PICTURE_HEIGHT, PhotoUtil.PICTURE_WIDTH, imageUri);}if (data == null)return;// 读取相册缩放图片if (requestCode == PhotoUtil.PHOTOZOOM) {path = PhotoUtil.getPath(this);// 生成一个地址用于存放剪辑后的图片if (TextUtils.isEmpty(path)) {Log.e(TAG, "随机生成的用于存放剪辑后的图片的地址失败");return;}Uri imageUri = UriPathUtils.getUri(this, path);PhotoUtil.startPhotoZoom(MainActivity.this, data.getData(), PhotoUtil.PICTURE_HEIGHT, PhotoUtil.PICTURE_WIDTH, imageUri);}// 处理结果if (requestCode == PhotoUtil.PHOTORESOULT) {/** * 在这里处理剪辑结果,可以获取缩略图,获取剪辑图片的地址。得到这些信息可以选则用于上传图片等等操作 * *//** * 如,根据path获取剪辑后的图片 */Bitmap bitmap = PhotoUtil.convertToBitmap(path,PhotoUtil.PICTURE_HEIGHT, PhotoUtil.PICTURE_WIDTH);if(bitmap != null){tv2.setText(bitmap.getHeight()+"x"+bitmap.getWidth()+"图");clipImg.setImageBitmap(bitmap);}Bitmap bitmap2 = PhotoUtil.convertToBitmap(path,120, 120);if(bitmap2 != null){tv1.setText(bitmap2.getHeight()+"x"+bitmap2.getWidth()+"图");smallImg.setImageBitmap(bitmap2);}//Bundle extras = data.getExtras();//if (extras != null) {//Bitmap photo = extras.getParcelable("data");//ByteArrayOutputStream stream = new ByteArrayOutputStream();//photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);// (0-100)压缩文件//InputStream isBm = new ByteArrayInputStream(stream.toByteArray());//}}super.onActivityResult(requestCode, resultCode, data);}protected void options() {ActionSheetDialog mDialog = new ActionSheetDialog(this).builder();mDialog.setTitle("选择");mDialog.setCancelable(false);mDialog.addSheetItem("拍照", SheetItemColor.Blue, new OnSheetItemClickListener() {@Overridepublic void onClick(int which) {PhotoUtil.photograph(MainActivity.this);}}).addSheetItem("从相册选取", SheetItemColor.Blue, new OnSheetItemClickListener() {@Overridepublic void onClick(int which) {PhotoUtil.selectPictureFromAlbum(MainActivity.this);}}).show();}@Overrideprotected void onDestroy() {super.onDestroy();}}
效果图展示:
拍照+剪辑:
相册选取+剪辑:
最后附上Demo地址:http://download.csdn.net/detail/loveyaozu/9492321
1 0
- Android之本地相册图片选取和拍照以及图片剪辑
- Android之本地相册图片选取和拍照以及图片剪辑
- Android 拍照或从本地相册选取图片
- 图片拍照上传和相册选取
- Android 拍照上传和拍照本地显示,拍照剪切上传,选取本地图片剪切上传
- Android拍照或者选取本地图片
- Android 选取图片、手机拍照以及保存图片到本地、读取图片
- Android启动相机拍照、相册选取图片,裁剪图片
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- android相册拍照保存图片到本地
- android 选取相册图片
- android之选取本地图片
- 上传图片到服务器和图片内存处理以及拍照或从相册选取图片的小总结
- Android拍照、相册选取、裁剪图片综合Demo
- 打开相机拍照和从本地相册获取图片以及图片的剪切
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
- 项目以及ide的编码格式都改为utf-8后,页面依旧乱码问题的解决方法
- 面试中的一道排序题算法
- Java并发编程:Lock
- [技术文章搬家]STM32F207V学习笔记-GPIO
- Android之本地相册图片选取和拍照以及图片剪辑
- JTA 深度历险 - 原理与实现
- win7 Ubuntu Server 15.10 双系统安装 亲测成功
- [笔记]Python
- 优先队列(priority_queue)
- spring aop中的propagation的7种配置的意思
- 正则表达式中的贪婪非贪婪
- android中RecyclerView的使用
- 线程总结