[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4238":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":22,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":35,"discoverSource":36},4238,"TakePhoto","crazycodeboy\u002FTakePhoto","crazycodeboy","一款用于在Android设备上获取照片（拍照或从相册、文件中选择）、裁剪图片、压缩图片的开源工具库","http:\u002F\u002Fwww.devio.org\u002Ftags\u002F#TakePhoto",null,"Java",7230,1496,181,419,0,2,65.73,"Apache License 2.0",false,"master",true,[24,25,26,27,28,29,30,31],"android","android-cropper","camera","compress-images","crop-image","image-cropper","image-picker","takephoto","2026-06-12 04:00:21","## [TakePhoto](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto) 简介\n\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-Welcome-brightgreen.svg)](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fpulls)\n[![Download](https:\u002F\u002Fapi.bintray.com\u002Fpackages\u002Fcrazycodeboy\u002Fmaven\u002FTakePhoto\u002Fimages\u002Fdownload.svg) ](https:\u002F\u002Fbintray.com\u002Fcrazycodeboy\u002Fmaven\u002FTakePhoto\u002F_latestVersion)\n[![GitHub release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Frelease\u002Fcrazycodeboy\u002FTakePhoto.svg?maxAge=2592000?style=flat-square)](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Freleases)\n[![License Apache2.0](http:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache2.0-brightgreen.svg?style=flat)](https:\u002F\u002Fraw.githubusercontent.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fmaster\u002FLICENSE)\n\n\n\n`TakePhoto`是一款用于在Android设备上获取照片（拍照或从相册、文件中选择）、裁剪图片、压缩图片的开源工具库，目前最新版本[4.1.0](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002F)。\n3.0以下版本及API说明，详见[TakePhoto2.0+](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fblob\u002Fmaster\u002FREADME.2+.md)。  \n\n>TakePhoto交流平台：QQ群：556387607（群1，未满）\n\n**V4.0**\n\n- 支持通过相机拍照获取图片\n- 支持从相册选择图片\n- 支持从文件选择图片  \n- 支持批量图片选取\n- 支持图片压缩以及批量图片压缩\n- 支持图片裁切以及批量图片裁切\n- 支持照片旋转角度自动纠正\n- 支持自动权限管理(无需关心SD卡及摄像头权限等问题)\n- 支持对裁剪及压缩参数个性化配置  \n- 提供自带裁剪工具(可选)  \n- 支持智能选取及裁剪异常处理\n- 支持因拍照Activity被回收后的自动恢复   \n- 支持Android8.1\n- +支持多种压缩工具\n- +支持多种图片选择工具\n\nGitHub地址： [https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto)\n## 目录\n\n- [安装说明](#安装说明)\n- [演示](#演示)\n- [使用说明](#使用说明)\n- [自定义UI](#自定义ui)\n- [API](#api)\n- [兼容性](#兼容性)\n- [贡献](#贡献)\n- [更新说明](#更新说明)\n- [最后](#混淆)\n\n## 安装说明  \n**Gradle:**  \n\n```groovy\n    compile 'com.jph.takephoto:takephoto_library:4.1.0'\n```\n\n**Maven:**  \n\n```groovy\n\u003Cdependency>\n  \u003CgroupId>com.jph.takephoto\u003C\u002FgroupId>\n  \u003CartifactId>takephoto_library\u003C\u002FartifactId>\n  \u003Cversion>4.1.0\u003C\u002Fversion>\n  \u003Ctype>pom\u003C\u002Ftype>\n\u003C\u002Fdependency>\n```  \n\n\n## 演示 \n\n运行效果图：    \n![预览图](https:\u002F\u002Fraw.githubusercontent.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fmaster\u002FScreenshots\u002Ftakephoto_preview.png)\n![运行效果图](https:\u002F\u002Fraw.githubusercontent.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fmaster\u002FScreenshots\u002F%E9%A2%84%E8%A7%88%E5%9B%BE.jpg)\n\n\n## 使用说明   \n\n### 使用TakePhoto有以下两种方式：\n**方式一：通过继承的方式**  \n1. 继承`TakePhotoActivity`、`TakePhotoFragmentActivity`、`TakePhotoFragment`三者之一。  \n2. 通过`getTakePhoto()`获取`TakePhoto`实例进行相关操作。  \n3. 重写以下方法获取结果        \n\n```java\n void takeSuccess(TResult result);\n void takeFail(TResult result,String msg);\n void takeCancel();\n```  \n此方式使用简单，满足的大部分的使用需求，具体使用详见[simple](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fblob\u002Fmaster\u002Fsimple\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fjph\u002Fsimple\u002FSimpleActivity.java)。如果通过继承的方式无法满足实际项目的使用，可以通过下面介绍的方式。  \n\n**方式二：通过组装的方式**  \n\n可参照：[TakePhotoActivity](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fblob\u002Fmaster\u002Ftakephoto_library\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fjph\u002Ftakephoto\u002Fapp\u002FTakePhotoActivity.java)，以下为主要步骤：  \n\n1.实现`TakePhoto.TakeResultListener,InvokeListener`接口。\n\n2.在 `onCreate`,`onActivityResult`,`onSaveInstanceState`方法中调用TakePhoto对用的方法。  \n\n3.重写`onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)`，添加如下代码。\n\n```java\n  @Override\n    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        \u002F\u002F以下代码为处理Android6.0、7.0动态权限所需\n        TPermissionType type=PermissionManager.onRequestPermissionsResult(requestCode,permissions,grantResults);\n        PermissionManager.handlePermissionsResult(this,type,invokeParam,this);\n    }\n```    \n\n4.重写`TPermissionType invoke(InvokeParam invokeParam)`方法，添加如下代码：  \n\n```java\n @Override\n    public TPermissionType invoke(InvokeParam invokeParam) {\n        TPermissionType type=PermissionManager.checkPermission(TContextWrap.of(this),invokeParam.getMethod());\n        if(TPermissionType.WAIT.equals(type)){\n            this.invokeParam=invokeParam;\n        }\n        return type;\n    }\n```\n\n5.添加如下代码获取TakePhoto实例：  \n\n```java\n   \u002F**\n     *  获取TakePhoto实例\n     * @return\n     *\u002F\n    public TakePhoto getTakePhoto(){\n        if (takePhoto==null){\n            takePhoto= (TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this,this));\n        }\n        return takePhoto;\n    }    \n```\n\n## 自定义UI\n\nTakePhoto不仅支持对相关参数的自定义，也支持对UI的自定义，下面就像大家介绍如何自定义TakePhoto的相册与裁剪工具的UI。\n\n### 自定义相册\n如果TakePhoto自带相册的UI不符合你应用的主题的话，你可以对它进行自定义。方法如下：   \n\n#### 自定义Toolbar \n\n在“res\u002Flayout”目录中创建一个名为“toolbar.xml”的布局文件，内容如下：   \n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Candroid.support.v7.widget.Toolbar xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"\n    xmlns:app=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"?attr\u002FactionBarSize\"\n    app:theme=\"@style\u002FCustomToolbarTheme\"\n    android:background=\"#ffa352\">\n\u003C\u002Fandroid.support.v7.widget.Toolbar>\n```\n\n在“toolbar.xml”文件中你可以指定TakePhoto自带相册的主题以及Toolbar的背景色。\n\n#### 自定义状态栏\n\n在“res\u002Fvalues”目录中创建一个名为“colors.xml”的资源文件，内容如下： \n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Cresources>\n    \u003Ccolor name=\"multiple_image_select_primaryDark\">#212121\u003C\u002Fcolor>\n\u003C\u002Fresources>\n```\n\n通过上述方式便可以自定义状态栏的颜色。\n\n#### 自定义提示文字\n\n在“res\u002Fvalues”目录的“string.xml”文件冲添加如下代码：\n\n```xml\n\u003Cresources>    \n    \u003Cstring name=\"album_view\">选择图片\u003C\u002Fstring>\n    \u003Cstring name=\"image_view\">单击选择\u003C\u002Fstring>\n    \u003Cstring name=\"add\">确定\u003C\u002Fstring>\n    \u003Cstring name=\"selected\">已选\u003C\u002Fstring>\n    \u003Cstring name=\"limit_exceeded\">最多能选 %d 张\u003C\u002Fstring>\n\u003C\u002Fresources>\n```\n\n重写上述代码，便可以自定义TakePhoto自带相册的提示文字。\n\n### 自定义裁切工具\n\n在“res\u002Flayout”目录中创建一个名为“crop__activity_crop.xml”与“crop__layout_done_cancel.xml”的布局文件，内容如下：  \n\n**crop__activity_crop.xml**  \n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CRelativeLayout\n    xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    \u003Ccom.soundcloud.android.crop.CropImageView\n        android:id=\"@+id\u002Fcrop_image\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"@drawable\u002Fcrop__texture\"\n        android:layout_above=\"@+id\u002Fdone_cancel_bar\" \u002F>\n    \u003Cinclude\n        android:id=\"@+id\u002Fdone_cancel_bar\"\n        android:layout_alignParentBottom=\"true\"\n        layout=\"@layout\u002Fcrop__layout_done_cancel\"\n        android:layout_height=\"50dp\"\n        android:layout_width=\"match_parent\" \u002F>\n\u003C\u002FRelativeLayout>\n```\n\n**crop__layout_done_cancel.xml**  \n\n```xml\n\u003CLinearLayout xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"\n    style=\"@style\u002FCrop.DoneCancelBar\">\n    \u003CFrameLayout\n        android:id=\"@+id\u002Fbtn_cancel\"\n        style=\"@style\u002FCrop.ActionButton\">\n        \u003CTextView style=\"@style\u002FCrop.ActionButtonText.Cancel\" \u002F>\n    \u003C\u002FFrameLayout>\n    \u003CFrameLayout\n        android:id=\"@+id\u002Fbtn_done\"\n        style=\"@style\u002FCrop.ActionButton\">\n        \u003CTextView style=\"@style\u002FCrop.ActionButtonText.Done\" \u002F>\n    \u003C\u002FFrameLayout>\n\u003C\u002FLinearLayout>\n```\n\n重写上述代码，便可以自定义TakePhoto裁切工具的UI。\n\n## API\n\n### 获取图片\nTakePhoto提供拍照，从相册选择，从文件中选择三种方式获取图片。    \n\n#### API:\n\n```java\n\u002F**\n * 从文件中获取图片（不裁剪）\n *\u002F\nvoid onPickFromDocuments();\n\u002F**\n * 从相册中获取图片（不裁剪）\n *\u002F\nvoid onPickFromGallery();\n\u002F**\n * 从相机获取图片(不裁剪)\n * @param outPutUri 图片保存的路径\n *\u002F\nvoid onPickFromCapture(Uri outPutUri);\n\u002F**\n * 图片多选\n * @param limit 最多选择图片张数的限制\n **\u002F\nvoid onPickMultiple(int limit);\n```\n以上三种方式均提供对应的裁剪API，详见：[裁剪图片](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto#裁剪图片)。    \n**注：**  \n由于不同Android Rom厂商对系统有不同程度的定制，有可能导致某种选择图片的方式不支持，所以为了提高`TakePhoto`的兼容性，当某种选的图片的方式不支持时，`TakePhoto`会自动切换成使用另一种选择图片的方式进行图片选择。      \n\n### 裁剪图片  \n\n#### API  \n`TakePhoto`支持对图片进行裁剪，无论是拍照的照片,还是从相册、文件中选择的图片。你只需要调用`TakePhoto`的相应方法即可：  \n\n```java\n\u002F**\n * 从相机获取图片并裁剪\n * @param outPutUri 图片裁剪之后保存的路径\n * @param options 裁剪配置             \n *\u002F\nvoid onPickFromCaptureWithCrop(Uri outPutUri, CropOptions options);\n\u002F**\n * 从相册中获取图片并裁剪\n * @param outPutUri 图片裁剪之后保存的路径\n * @param options 裁剪配置\n *\u002F\nvoid onPickFromGalleryWithCrop(Uri outPutUri, CropOptions options);\n\u002F**\n * 从文件中获取图片并裁剪\n * @param outPutUri 图片裁剪之后保存的路径\n * @param options 裁剪配置\n *\u002F\nvoid onPickFromDocumentsWithCrop(Uri outPutUri, CropOptions options);\n\u002F**\n * 图片多选，并裁切\n * @param limit 最多选择图片张数的限制\n * @param options  裁剪配置\n * *\u002F\nvoid onPickMultipleWithCrop(int limit, CropOptions options);\n```   \n#### 对指定图片进行裁剪     \n另外，TakePhoto也支持你对指定图片进行裁剪：     \n\n```java\n\u002F**\n * 裁剪图片\n * @param imageUri 要裁剪的图片\n * @param outPutUri 图片裁剪之后保存的路径\n * @param options 裁剪配置\n *\u002F\nvoid onCrop(Uri imageUri, Uri outPutUri, CropOptions options)throws TException;\n\u002F**\n * 裁剪多张图片\n * @param multipleCrop 要裁切的图片的路径以及输出路径\n * @param options 裁剪配置\n *\u002F\nvoid onCrop(MultipleCrop multipleCrop, CropOptions options)throws TException;\n```\n\n#### CropOptions\n`CropOptions`是用于裁剪的配置类，通过它你可以对图片的裁剪比例，最大输出大小，以及是否使用`TakePhoto`自带的裁剪工具进行裁剪等，进行个性化配置。    \n\n**Usage:**  \n\n```java\n CropOptions cropOptions=new CropOptions.Builder().setAspectX(1).setAspectY(1).setWithOwnCrop(true).create();  \n getTakePhoto().onPickFromDocumentsWithCrop(imageUri,cropOptions);  \n \u002F\u002F或  \n getTakePhoto().onCrop(imageUri,outPutUri,cropOptions);  \n\n```\n\n**注：**  \n由于不同Android Rom厂商对系统有不同程度的定制，有可能系统中没有自带或第三方的裁剪工具，所以为了提高`TakePhoto`的兼容性，当系统中没有自带或第三方裁剪工具时，`TakePhoto`会自动切换到使用`TakePhoto`自带的裁剪工具进行裁剪。  \n\n>另外TakePhoto4.0+支持指定使用TakePhoto自带相册,如：`takePhoto.setTakePhotoOptions(new TakePhotoOptions.Builder().setWithOwnGallery(true).create());`\n详情可参考:[Demo](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fblob\u002Fmaster\u002Fsimple\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fjph\u002Fsimple\u002FCustomHelper.java)\n\n### 压缩图片\n你可以选择是否对图片进行压缩处理，你只需要告诉它你是否要启用压缩功能以及`CompressConfig`即可。  \n\n#### API\n```java\n \u002F**\n  * 启用图片压缩\n  * @param config 压缩图片配置\n  * @param showCompressDialog 压缩时是否显示进度对话框\n  * @return\n  *\u002F\n void onEnableCompress(CompressConfig config,boolean showCompressDialog);\n```\n\n**Usage:**  \n\n```java\nTakePhoto takePhoto=getTakePhoto();\ntakePhoto.onEnableCompress(compressConfig,true);\ntakePhoto.onPickFromGallery();\n```  \n如果你启用了图片压缩，`TakePhoto`会使用`CompressImage`对图片进行压缩处理，`CompressImage`目前支持对图片的尺寸以及图片的质量进行压缩。默认情况下，`CompressImage`开启了尺寸与质量双重压缩。  \n\n#### 对指定图片进行压缩  \n另外，你也可以对指定图片进行压缩：    \n**Usage:**  \n\n```java\nnew CompressImageImpl(compressConfig,result.getImages(), new CompressImage.CompressListener() {\n    @Override\n    public void onCompressSuccess(ArrayList\u003CTImage> images) {\n        \u002F\u002F图片压缩成功\n    }\n    @Override\n    public void onCompressFailed(ArrayList\u003CTImage> images, String msg) {\n        \u002F\u002F图片压缩失败\n    }\n}).compress();\n```\n\n#### CompressConfig  \n`CompressConfig`是用于图片压缩的配置类，你可以通过`CompressConfig.Builder`对图片压缩后的尺寸以及质量进行相关设置。如果你想改变压缩的方式可以通过`CompressConfig.Builder`进行相关设置。     \n**Usage:**   \n\n```java\nCompressConfig compressConfig=new CompressConfig.Builder().setMaxSize(50*1024).setMaxPixel(800).create();\n```\n#### 指定压缩工具\n\n#### 使用TakePhoto压缩工具进行压缩： \n\n```\nCompressConfig config=new CompressConfig.Builder()\n                    .setMaxSize(maxSize)\n                    .setMaxPixel(width>=height? width:height)\n                    .create();\ntakePhoto.onEnableCompress(config,showProgressBar);\n```\n\n#### 使用Luban进行压缩： \n```\nLubanOptions option=new LubanOptions.Builder()\n                    .setGear(Luban.CUSTOM_GEAR)\n                    .setMaxHeight(height)\n                    .setMaxWidth(width)\n                    .setMaxSize(maxSize)\n                    .create();\nCompressConfig config=CompressConfig.ofLuban(option);\ntakePhoto.onEnableCompress(config,showProgressBar);\n```\n\n>详情可参考Demo:[CustomHelper.java](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fblob\u002Fmaster\u002Fsimple\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fjph\u002Fsimple\u002FCustomHelper.java)\n\n\n## 兼容性\n\n### Android6.0\n由于Android6.0新增了\"运行时权限控制(Runtime Permissions)\"，为了应对这一改变，TakePhoto加入和自动权限管理，当TakePhoto检测到需要权限时，TakePhoto会自动申请权限，所以小伙伴们不用担心权限的使用问题。\n\n### Android7.0  \n\n在Android N中，Android 框架执行了 StrictMode，应用间共享文件和以前也有所区别。为了适配Android7.0的改变，同时也为了方便大家使用TakePhoto，TakePhoto会自动根据手机的Android版本自行适配，小伙伴们依旧可以向TakePhoto传递`Uri imageUri = Uri.fromFile(file);`类型的Uri而不用担心兼容性问题。\n\n### TakePhoto在深度兼容性方面的测试    \n![兼容性测试报告](https:\u002F\u002Fraw.githubusercontent.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fmaster\u002FScreenshots\u002F%E5%85%BC%E5%AE%B9%E6%80%A7%E6%B5%8B%E8%AF%95.jpg)\n\n### 获取更高的兼容性    \n`TakePhot`o是基于Android官方标准API编写的，适配了目前市场上主流的Rom。如果你在使用过程中发现了适配问题，可以[提交Issues](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fissues)。   \n1. 为适配部分手机拍照时会回收`Activity`，`TakePhoto`在`onSaveInstanceState`与 `onCreate`做了相应的恢复处理。  \n2. 为适配部分手机拍照或从相册选择图片时屏幕方向会发生转变,从而导致拍照失败的问题，可以在AndroidManifest.xml中对使用了`TakePhoto`的`Activity`添加android:configChanges=\"orientation|keyboardHidden|screenSize\"配置。  \neg:  \n\n```\n\u003Cactivity\n    android:name=\".MainActivity\"\n    android:screenOrientation=\"portrait\"\n    android:configChanges=\"orientation|keyboardHidden|screenSize\"\n    android:label=\"@string\u002Fapp_name\" >\n    \u003Cintent-filter>\n        \u003Caction android:name=\"android.intent.action.MAIN\" \u002F>\n        \u003Ccategory android:name=\"android.intent.category.LAUNCHER\" \u002F>\n    \u003C\u002Fintent-filter>\n\u003C\u002Factivity>\n```\n\n## 贡献  \n如果你在使用TakePhoto中遇到任何问题可以提[Issues](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fissues)出来。另外欢迎大家为TakePhoto贡献智慧，欢迎大家[Fork and Pull requests](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto)。     \n\n## 更新说明\n\nv4.1.0(2018\u002F4\u002F2)\n-----------------\n\n1. Upgrade glide to 4.6.1；\n2. Upgrade  buildToolsVersion & targetSdkVersion ；\n3. rename package name ;\n\nv4.0.3(2017\u002F1\u002F18)\n-----------------\n**Bugfixes**\n\n1. Fixed bug and add new features([`62a6725`](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fcommit\u002F62a6725a99118ec0ce0f4cf1cd76b2ba70e21745))-@[Yanqilong](https:\u002F\u002Fgithub.com\u002FYanqilong)\n2. fix 鲁班压缩出现路径重复([`a0a64a59`](https:\u002F\u002Fgithub.com\u002Fcrazycodeboy\u002FTakePhoto\u002Fcommit\u002Fa0a64a59762fa8554eb46b6ec544f70a5d46f551))-@[namezhouyu](https:\u002F\u002Fgithub.com\u002Fnamezhouyu)\n\n\nv4.0.2(2016\u002F11\u002F28)\n------------------\n1. 压缩成功后返回原图路径(originalPath), 以便用户可以自行处理原图。\n2. 压缩成功后压缩路径path改为compressPath。\n3. 压缩成功后返回图片来源类型，现在分CAMERA, OTHER两种。\n4. 用户可以配置CompressConfig.enableReserveRaw(boolean)方法，ture保留原图，false删除原图，当且仅当类型为CAMERA此配置才有效\n5. 纠正拍照旋转角度功能改为可选\n\n## 最后\n\n### 关于代码混淆\n如果你的项目中启用了代码混淆，可在混淆规则文件(如：proguard-rules.pro)中添加如下代码：   \n\n```\n-keep class com.jph.takephoto.** { *; }\n-dontwarn com.jph.takephoto.**\n\n-keep class com.darsh.multipleimageselect.** { *; }\n-dontwarn com.darsh.multipleimageselect.**\n\n-keep class com.soundcloud.android.crop.** { *; }\n-dontwarn com.soundcloud.android.crop.**\n\n```\n","TakePhoto是一款专为Android平台设计的开源工具库，用于实现拍照、从相册或文件中选择图片、裁剪及压缩图片等功能。其核心功能包括支持单张或多张图片的选择与处理、自动权限管理以及多种压缩和选择工具的集成，能够满足开发者对图片处理的各种需求。该库还提供了灵活的配置选项，允许用户自定义裁剪和压缩参数，并且内置了裁剪工具以简化开发流程。适用于需要在移动应用中集成图片获取与处理功能的各种场景，如社交媒体分享、个人资料设置等。","2026-06-11 02:59:11","top_language"]