当前位置: 首页 » 产品 » 生活保健 » 正文

Android获取照片、裁剪图片、压缩图片教程

放大字体  缩小字体 发布日期: 2024-11-27 22:37   来源:http://www.baidu.com/  作者:无忧资讯  浏览次数:19
核心提示:在做上一个项目时深深受到了图片上传的苦恼。图片上传主要分为两个部分,首先要获取图片,而获取图片可以分为从文件获取或者拍照

在做上一个项目时深深受到了图片上传的苦恼。图片上传主要分为两个部分,首先要获取图片,而获取图片可以分为从文件获取或者拍照获取。第二个部分才是上传图片,两个部分都是走了不少弯路。由于Android系统的碎片化比较严重,我们可能出现在第一台机子上能获取图片,但是换一个机子就不能获取图片的问题,并且在Android6.0,7.0之后也要做一定的适配,这样对于开发者来说,无疑很蛋疼。由于也是初学者,很多东西没有考虑到,适配起来也是有点难度的。

这几天也是从github上找到了一个库(地址在这TakePhoto),经过简单的学习之后,发现用起来还是蛮简单的,并且在不同机型之间都能达到同样的效果。更重要的是可以根据不同配置达到不同的效果

接下来看下用法

获取图片

1) 获取TakePhoto对象

一) 通过继承的方式

继承TakePhotoActivity、TakePhotoFragmentActivity、TakePhotoFragment三者之一。
通过getTakePhoto()获取TakePhoto实例进行相关操作。
重写以下方法获取结果

void takeSuccess(TResult result); void takeFail(TResult result,String msg); void takeCancel();

这种方法使用起来虽然简单,但是感觉定制性不高,必须继承指定的Activity,而 有时我们已经封装好了baseActivity,不想再改了。有时候通过继承无法满足实际项目的需求。

二) 通过组装的方式去使用

实现TakePhoto.TakeResultListener,InvokeListener接口。
在 onCreate,onActivityResult,onSaveInstanceState方法中调用TakePhoto对用的方法。
重写onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults),添加如下代码。

@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //以下代码为处理Android6.0、7.0动态权限所需 TPermissionType type=PermissionManager.onRequestPermissionsResult(requestCode,permissions,grantResults); PermissionManager.handlePermissionsResult(this,type,invokeParam,this); }

重写TPermissionType invoke(InvokeParam invokeParam)方法,添加如下代码:

@Override public TPermissionType invoke(InvokeParam invokeParam) { TPermissionType type=PermissionManager.checkPermission(TContextWrap.of(this),invokeParam.getMethod()); if(TPermissionType.WAIT.equals(type)){ this.invokeParam=invokeParam; } return type; }

添加如下代码获取TakePhoto实例:

public TakePhoto getTakePhoto(){ if (takePhoto==null){ takePhoto=(TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this,this)); } return takePhoto; }

2)自定义UI

不仅可以对于参数自定义,也可以对于UI的自定义,比如自定义相册,自定义Toolbar, 自定义状态栏,自定义提示文字,自定义裁切工具(需要使用自带的TakePhoto裁剪才行)。

3)通过TakePhoto对象获取图片

支持从相册获取,也支持拍照,相关Api

* 从相机获取图片并裁剪 * @param outPutUri 图片裁剪之后保存的路径 * @param options 裁剪配置 */ void onPickFromCaptureWithCrop(Uri outPutUri, CropOptions options); void onPickFromGalleryWithCrop(Uri outPutUri, CropOptions options); void onPickFromdocumentsWithCrop(Uri outPutUri, CropOptions options); void onPickMultipleWithCrop(int limit, CropOptions options);

4)裁剪配置

CropOptions 用于裁剪的配置类,可以对图片的裁剪比例,最大输出大小,以及是否使用TakePhoto自带的裁剪工具进行裁剪等,进行个性化配置。

压缩图片 onEnableCompress(CompressConfig config,boolean showCompressDialog)

指定压缩工具 takePhoto里面自带压缩算法,也可以通过第三方的Luban进行压缩

对于TakePhoto的二次封装

封装是对第二种方法的封装,主要参考了第一种的思想封装的。
关于TakePhoto的库代码全部封装到一个TakePhotoUtil工具类中,看代码:

public class TakePhotoUtil implements TakePhoto.TakeResultListener, InvokeListener { private static final String TAG=TakePhotoUtil.class.getName(); private TakePhoto takePhoto; private InvokeParam invokeParam; private Activity activity; private Fragment fragment; public TakePhotoUtil(Activity activity){ this.activity=activity; } public TakePhotoUtil(Fragment fragment){ this.fragment=fragment; } public TakePhoto getTakePhoto(){ if (takePhoto==null){ takePhoto=(TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(activity,this)); } return takePhoto; } public void onCreate(Bundle savedInstanceState){ getTakePhoto().onCreate(savedInstanceState); } public void onSaveInstanceState(Bundle outState){ getTakePhoto().onSaveInstanceState(outState); } public void onActivityResult(int requestCode, int resultCode, Intent data){ getTakePhoto().onActivityResult(requestCode, resultCode, data); } public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { PermissionManager.TPermissionType type=PermissionManager.onRequestPermissionsResult(requestCode,permissions,grantResults); PermissionManager.handlePermissionsResult(activity,type,invokeParam,this); } @Override public void takeSuccess(TResult result) { if(listener !=null){ listener.takeSuccess(result); } // deleteCachePic(); } @Override public void takeFail(TResult result, String msg) { if(listener !=null){ listener.takeFail(result, msg); } // deleteCachePic(); } @Override public void takeCancel() { if(listener !=null){ listener.takeCancel(); } } public void deleteCachePic(){ File file=new File(Environment.getExternalStorageDirectory(), "/takephoto/"); if(!file.exists()) return; File[] files=file.listFiles(); for (File f: files) { f.delete(); } } public interface TakePhotoListener{ void takeSuccess(TResult result); void takeFail(TResult result, String msg); void takeCancel(); } public TakePhotoListener listener; public void setTakePhotoListener(SimpleTakePhotoListener listener){ this.listener=listener; } public static class SimpleTakePhotoListener implements TakePhotoListener{ @Override public void takeSuccess(TResult result) { } @Override public void takeFail(TResult result, String msg) { } @Override public void takeCancel() { } } @Override public PermissionManager.TPermissionType invoke(InvokeParam invokeParam) { PermissionManager.TPermissionType type=PermissionManager.checkPermission(TContextWrap.of(activity),invokeParam.getMethod()); if(PermissionManager.TPermissionType.WAIT.equals(type)){ this.invokeParam=invokeParam; } return type; } public void takePhoto(Select_type select_type, SimpleTakePhotoListener listener){ takePhoto(select_type, null, listener); } public void takePhoto(Select_type select_type, PhotoConfigOptions cropOptions, SimpleTakePhotoListener listener){ if (takePhoto==null){ Toast.makeText(activity, "请先开启照片功能", Toast.LENGTH_SHORT).show(); return; } setTakePhotoListener(listener); if(cropOptions==null){ cropOptions=new PhotoConfigOptions(); } cropOptions.configCompress(); //压缩配置 cropOptions.configTakePhoto(); //拍照配置 File file=new File(Environment.getExternalStorageDirectory(), "/takephoto/"+System.currentTimeMillis() + ".jpg"); if (!file.getParentFile().exists())file.getParentFile().mkdirs(); Uri imageUri=Uri.fromFile(file); switch (select_type){ case PICK_BY_SELECT: //从相册获取 if(cropOptions.limit > 1){ if(cropOptions.crop==true){ takePhoto.onPickMultipleWithCrop(cropOptions.limit, cropOptions.getCropOptions()); }else { takePhoto.onPickMultiple(cropOptions.limit); } } if(cropOptions.chooseFromFile){ if(cropOptions.crop==true){ takePhoto.onPickFromdocumentsWithCrop(imageUri, cropOptions.getCropOptions()); }else { takePhoto.onPickFromdocuments(); } }else { if(cropOptions.crop==true){ takePhoto.onPickFromGalleryWithCrop(imageUri, cropOptions.getCropOptions()); }else { takePhoto.onPickFromGallery(); } } break; case PICK_BY_TAKE: //拍照获取 if(cropOptions.crop==true){ takePhoto.onPickFromCaptureWithCrop(imageUri, cropOptions.getCropOptions()); }else { takePhoto.onPickFromCapture(imageUri); } break; default: break; } } public class PhotoConfigOptions{ //裁剪配置 private boolean crop=true; //是否裁剪 private boolean withWonCrop=true; //是否采用自带的裁剪工具,默认选取第三方的裁剪工具 private boolean cropSize=true; //尺寸还是比例 //压缩配置 private boolean useOwnCompressTool=true; //使用自带的压缩工具 private boolean isCompress=true; //是否压缩 private boolean showProgressBar=true; //显示压缩进度条 // private private int maxSize=102400; //选择图片配置 private boolean useOwnGallery=true; //选择使用自带的相册 private boolean chooseFromFile=false; //从文件获取图片 private int limit=1; //选择最多图片的配置,选择多张图片会自动切换到TakePhoto自带相册 //其它配置 private boolean savePic=true; //选择完之后是否保存图片 private boolean correctTool=false; //纠正拍照的照片旋转角度 private int height=800; private int width=800; public CropOptions getCropOptions(){ if(crop==false) return null; CropOptions.Builder builder=new CropOptions.Builder(); if(cropSize){ builder.setOutputX(width).setOutputY(height); }else { builder.setAspectX(width).setAspectY(height); } builder.setWithOwnCrop(withWonCrop); //默认采用第三方配置 return builder.create(); } public void configCompress(){ if(isCompress==false) { takePhoto.onEnableCompress(null, false); return; } CompressConfig config; if(useOwnCompressTool){ config=new CompressConfig.Builder() .setMaxSize(maxSize) .setMaxPixel(width>height?width:height) .enableReserveRaw(savePic) .create(); }else { LubanOptions options=new LubanOptions.Builder() .setMaxHeight(height) .setMaxWidth(maxSize) .create(); config=CompressConfig.ofLuban(options); config.enableReserveRaw(savePic); } takePhoto.onEnableCompress(config, showProgressBar); } public void configTakePhoto(){ TakePhotoOptions.Builder builder=new TakePhotoOptions.Builder(); if(useOwnGallery){ builder.setWithOwnGallery(true); } if(correctTool){ builder.setCorrectImage(true); } takePhoto.setTakePhotoOptions(builder.create()); } public void setCrop(boolean crop) { this.crop=crop; } public void setWithWonCrop(boolean withWonCrop) { this.withWonCrop=withWonCrop; } public void setCropSize(boolean cropSize) { this.cropSize=cropSize; } public void setUseOwnCompressTool(boolean useOwnCompressTool) { this.useOwnCompressTool=useOwnCompressTool; } public void setCompress(boolean compress) { isCompress=compress; } public void setShowProgressBar(boolean showProgressBar) { this.showProgressBar=showProgressBar; } public void setMaxSize(int maxSize) { this.maxSize=maxSize; } public void setUseOwnGallery(boolean useOwnGallery) { this.useOwnGallery=useOwnGallery; } public void setChooseFromFile(boolean chooseFromFile) { this.chooseFromFile=chooseFromFile; } public void setLimit(int limit) { this.limit=limit; } public void setSavePic(boolean savePic) { this.savePic=savePic; } public void setCorrectTool(boolean correctTool) { this.correctTool=correctTool; } public void setHeight(int height) { this.height=height; } public void setWidth(int width) { this.width=width; } } public enum Select_type{ PICK_BY_SELECT, PICK_BY_TAKE } }

封装了一个baseTakePhotoActivity,里面的代码如下:

 
 
[ 产品搜索 ]  [ 加入收藏 ]  [ 告诉好友 ]  [ 打印本文 ]  [ 违规举报 ]  [ 关闭窗口 ]

 

 
推荐图文
推荐产品
点击排行
    行业协会  备案信息  可信网站