2016-05-18 10:07:36 +00:00
# react-native-image-crop-picker
2016-12-29 15:47:27 +00:00
iOS/Android image picker with support for camera, configurable compression, multiple images and cropping
2016-05-18 10:07:36 +00:00
2017-09-25 21:48:44 +00:00
[![Backers on Open Collective ](https://opencollective.com/react-native-image-crop-picker/backers/badge.svg )](#backers) [![Sponsors on Open Collective ](https://opencollective.com/react-native-image-crop-picker/sponsors/badge.svg )](#sponsors)
2016-05-18 10:07:36 +00:00
## Result
2017-08-24 19:37:53 +00:00
< p align = "left" >
< img width = 200 title = "iOS Single Pick" src = "https://github.com/ivpusic/react-native-image-crop-picker/blob/master/images/ios_single_pick.png" >
2016-07-27 00:30:48 +00:00
< img width = 200 title = "iOS Crop" src = "https://github.com/ivpusic/react-native-image-crop-picker/blob/master/images/ios_crop.png" >
2016-05-18 10:07:36 +00:00
< img width = 200 title = "iOS Multiple Pick" src = "https://github.com/ivpusic/react-native-image-crop-picker/blob/master/images/ios_multiple_pick.png" >
2017-08-24 19:37:53 +00:00
< / p >
2016-05-18 10:07:36 +00:00
## Usage
Import library
2017-12-07 00:50:54 +00:00
2016-05-18 10:07:36 +00:00
```javascript
import ImagePicker from 'react-native-image-crop-picker';
```
2017-08-24 19:37:53 +00:00
### Select from gallery
2016-08-11 21:45:33 +00:00
2016-05-18 10:07:36 +00:00
Call single image picker with cropping
```javascript
ImagePicker.openPicker({
width: 300,
height: 400,
cropping: true
}).then(image => {
console.log(image);
});
```
Call multiple image picker
2017-12-07 00:50:54 +00:00
2016-05-18 10:07:36 +00:00
```javascript
ImagePicker.openPicker({
multiple: true
}).then(images => {
console.log(images);
});
```
2017-09-11 23:07:56 +00:00
Select video only from gallery
2017-12-07 00:50:54 +00:00
2017-09-11 23:07:56 +00:00
```javascript
ImagePicker.openPicker({
mediaType: "video",
}).then((video) => {
console.log(video);
});
```
2017-09-27 18:25:41 +00:00
**Android: The prop 'cropping' has been known to cause videos not to be display in the gallery on Android. Please do not set cropping to true when selecting videos.**
2017-09-11 23:07:56 +00:00
2017-08-24 19:37:53 +00:00
### Select from camera
2017-12-07 00:50:54 +00:00
2016-08-11 21:45:33 +00:00
```javascript
ImagePicker.openCamera({
width: 300,
height: 400,
cropping: true
}).then(image => {
console.log(image);
});
```
2017-08-24 19:37:53 +00:00
### Crop picture
2017-12-07 00:50:54 +00:00
2017-02-07 20:00:39 +00:00
```javascript
ImagePicker.openCropper({
path: 'my-file-path.jpg',
width: 300,
height: 400
}).then(image => {
console.log(image);
});
```
2017-08-24 19:37:53 +00:00
### Optional cleanup
2017-12-07 00:50:54 +00:00
2016-09-07 19:41:31 +00:00
Module is creating tmp images which are going to be cleaned up automatically somewhere in the future. If you want to force cleanup, you can use `clean` to clean all tmp files, or `cleanSingle(path)` to clean single tmp file.
```javascript
ImagePicker.clean().then(() => {
console.log('removed all tmp images from tmp directory');
}).catch(e => {
alert(e);
});
```
2017-08-24 19:37:53 +00:00
### Request Object
2016-08-05 18:57:10 +00:00
2018-01-09 17:10:08 +00:00
| Property | Type | Description |
2017-07-25 07:30:37 +00:00
| --------------------------------------- | :--------------------------------------: | :--------------------------------------- |
| cropping | bool (default false) | Enable or disable cropping |
| width | number | Width of result image when used with `cropping` option |
| height | number | Height of result image when used with `cropping` option |
| multiple | bool (default false) | Enable or disable multiple image selection |
| includeBase64 | bool (default false) | Enable or disable returning base64 data with image |
2017-09-27 18:25:41 +00:00
| includeExif | bool (default false) | Include image exif data in the response |
2017-07-25 07:30:37 +00:00
| cropperActiveWidgetColor (android only) | string (default `"#424242"` ) | When cropping image, determines ActiveWidget color. |
| cropperStatusBarColor (android only) | string (default `#424242` ) | When cropping image, determines the color of StatusBar. |
| cropperToolbarColor (android only) | string (default `#424242` ) | When cropping image, determines the color of Toolbar. |
2017-11-26 01:11:13 +00:00
| cropperToolbarTitle (android only) | string (default `Edit Photo` ) | When cropping image, determines the title of Toolbar. |
2017-07-25 07:30:37 +00:00
| cropperCircleOverlay | bool (default false) | Enable or disable circular cropping mask. |
2017-08-04 07:23:59 +00:00
| minFiles (ios only) | number (default 1) | Min number of files to select when using `multiple` option |
2017-07-25 07:30:37 +00:00
| maxFiles (ios only) | number (default 5) | Max number of files to select when using `multiple` option |
| waitAnimationEnd (ios only) | bool (default true) | Promise will resolve/reject once ViewController `completion` block is called |
2018-01-09 17:11:08 +00:00
| smartAlbums (ios only) | array ([supported values](https://github.com/ivpusic/react-native-image-crop-picker/blob/master/README.md#smart-album-types-ios)) (default ['UserLibrary', 'PhotoStream', 'Panoramas', 'Videos', 'Bursts']) | List of smart albums to choose from |
2017-07-25 07:30:37 +00:00
| useFrontCamera (ios only) | bool (default false) | Whether to default to the front/'selfie' camera when opened |
| compressVideoPreset (ios only) | string (default MediumQuality) | Choose which preset will be used for video compression |
| compressImageMaxWidth | number (default none) | Compress image with maximum width |
| compressImageMaxHeight | number (default none) | Compress image with maximum height |
| compressImageQuality | number (default 1) | Compress image with quality (from 0 to 1, where 1 is best quality) |
| loadingLabelText (ios only) | string (default "Processing assets...") | Text displayed while photo is loading in picker |
| mediaType | string (default any) | Accepted mediaType for image selection, can be one of: 'photo', 'video', or 'any' |
| showsSelectedCount (ios only) | bool (default true) | Whether to show the number of selected assets |
| showCropGuidelines (android only) | bool (default true) | Whether to show the 3x3 grid on top of the image during cropping |
| hideBottomControls (android only) | bool (default false) | Whether to display bottom controls |
| enableRotationGesture (android only) | bool (default false) | Whether to enable rotating the image by hand gesture |
2018-01-09 17:10:08 +00:00
#### Smart Album Types (ios)
```
['PhotoStream', 'Generic', 'Panoramas', 'Videos', 'Favorites', 'Timepalses', 'AllHidden', 'RecentlyAdded', 'Bursts', 'SlomoVideos', 'UserLibrary', 'SelfPortraits', 'Screenshots', 'DepthEffect', 'LivePhotos', 'Animated', 'LongExposure']
```
2017-08-24 19:37:53 +00:00
### Response Object
2016-06-20 22:38:51 +00:00
2017-08-04 07:23:59 +00:00
| Property | Type | Description |
| ------------------------- | :----: | :--------------------------------------- |
| path | string | Selected image location |
| localIdentifier(ios only) | string | Selected images' localidentifier, used for PHAsset searching |
| sourceURL(ios only) | string | Selected images' source path, do not have write access |
| filename(ios only) | string | Selected images' filename |
| width | number | Selected image width |
| height | number | Selected image height |
| mime | string | Selected image MIME type (image/jpeg, image/png) |
| size | number | Selected image size in bytes |
| data | base64 | Optional base64 selected file representation |
2017-09-27 18:25:41 +00:00
| exif | object | Extracted exif data from image. Response format is platform specific |
2017-12-07 01:03:09 +00:00
| cropRect | object | Cropped image rectangle (width, height, x, y) |
2017-12-05 00:48:06 +00:00
| creationDate (ios only) | string | UNIX timestamp when image was created |
| modificationDate | string | UNIX timestamp when image was last modified |
2016-06-20 22:38:51 +00:00
2017-08-24 19:37:53 +00:00
# Install
2016-05-18 10:07:36 +00:00
2017-08-24 19:37:53 +00:00
## Install package
2017-08-10 21:18:07 +00:00
2017-12-07 00:50:54 +00:00
```bash
2016-08-25 23:48:45 +00:00
npm i react-native-image-crop-picker --save
2017-08-10 21:18:07 +00:00
```
2017-08-24 19:37:53 +00:00
Link the package using react-native link:
2017-08-10 21:18:07 +00:00
2017-12-07 00:50:54 +00:00
```bash
2016-08-25 23:04:38 +00:00
react-native link react-native-image-crop-picker
2016-05-18 10:07:36 +00:00
```
2017-08-24 19:37:53 +00:00
## Post-install steps
### iOS
#### Step 1:
2017-09-12 11:05:20 +00:00
In Xcode open Info.plist and add string key `NSPhotoLibraryUsageDescription` with value that describes why you need access to user photos. More info here https://forums.developer.apple.com/thread/62229. Depending on what features you use, you also may need `NSCameraUsageDescription` and `NSMicrophoneUsageDescription` keys.
2017-08-24 19:37:53 +00:00
#### Step 2:
##### Cocoapods (Highly recommended)
2017-08-10 21:18:07 +00:00
2017-12-07 00:50:54 +00:00
```bash
2017-08-24 19:37:53 +00:00
cd ios
pod init
2017-08-10 21:18:07 +00:00
```
2017-08-24 19:37:53 +00:00
After this you have to add pod dependencies to `Podfile` . Open `Podfile` with your editor, and add or adjust example configuration:
2016-07-14 20:56:07 +00:00
2017-12-07 00:50:54 +00:00
```bash
2017-08-24 19:37:53 +00:00
platform :ios, '8.0'
2016-09-08 15:53:19 +00:00
2017-08-24 19:37:53 +00:00
target '< your_project_name > ' do
pod 'RSKImageCropper'
pod 'QBImagePickerController'
end
```
2017-02-08 11:45:09 +00:00
2017-08-24 19:37:53 +00:00
After this run:
2016-09-08 15:53:19 +00:00
2017-12-07 00:50:54 +00:00
```bash
2017-08-24 19:37:53 +00:00
pod install
```
2016-09-10 22:51:05 +00:00
2017-08-24 19:37:53 +00:00
##### Manual
2016-09-08 15:53:19 +00:00
2016-09-02 12:18:32 +00:00
- Drag and drop the ios/ImageCropPickerSDK folder to your xcode project. (Make sure Copy items if needed IS ticked)
2016-08-25 23:04:38 +00:00
- Click on project General tab
- Under `Deployment Info` set `Deployment Target` to `8.0`
- Under `Embedded Binaries` click `+` and add `RSKImageCropper.framework` and `QBImagePicker.framework`
2016-05-18 10:07:36 +00:00
2017-08-24 19:37:53 +00:00
### Android
2016-08-26 13:20:27 +00:00
2017-03-03 00:46:32 +00:00
- Make sure you are using Gradle `2.2.x` (project build.gradle)
2017-12-07 00:28:51 +00:00
2017-03-03 00:46:32 +00:00
```gradle
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
...
}
...
}
```
2017-12-07 00:47:38 +00:00
- Add the following to your `build.gradle` 's repositories section. (project build.gradle)
2017-12-07 00:50:54 +00:00
2017-12-07 00:47:38 +00:00
```gradle
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
```
2017-03-03 00:46:32 +00:00
- Add `useSupportLibrary` (app build.gradle)
2017-12-07 00:28:51 +00:00
2017-03-03 00:46:32 +00:00
```gradle
android {
...
defaultConfig {
...
vectorDrawables.useSupportLibrary = true
...
}
...
}
```
2016-08-26 13:20:27 +00:00
- [Optional] If you want to use camera picker in your project, add following to `AndroidManifest.xml`
2016-11-18 01:20:26 +00:00
- `<uses-permission android:name="android.permission.CAMERA"/>`
2016-08-26 13:20:27 +00:00
2017-08-24 19:37:53 +00:00
## Production build
2016-09-07 00:43:05 +00:00
2017-08-24 19:37:53 +00:00
### iOS
2016-09-07 00:43:05 +00:00
2017-08-24 19:37:53 +00:00
#### Cocoapods (Highly recommended)
2016-09-08 15:53:19 +00:00
- You are already done
2017-08-24 19:37:53 +00:00
#### Manual
2016-09-08 15:53:19 +00:00
2016-09-07 00:43:05 +00:00
If you are using pre-built frameworks from `ios/ImageCropPickerSDK` , then before deploying app to production you should strip off simulator ARCHs from these, or you can add frameworks from `Libraries/imageCropPicker/Libraries/_framework_name_.xcodeproj/Products/_framework_name_.framework` to Embedded Binaries instead of pre-built ones.
Related issue: https://github.com/ivpusic/react-native-image-crop-picker/issues/61.
2016-09-07 15:03:37 +00:00
Details for second approach:
1. Remove the pre-built frameworks from `Embedded Binaries`
2. Build for Device
2017-07-25 07:30:37 +00:00
3. Add the newly built binaries for both frameworks to `Embedded Binaries` (located at `Libraries/imageCropPicker/Libraries/_framework_name_.xcodeproj/Products/_framework_name_.framework` )
2016-09-07 15:03:37 +00:00
2017-12-06 15:13:53 +00:00
## TO DO
- [ ] [Android] Standardize multiple select
- [ ] [Android] Pick remote media
2017-12-06 15:14:47 +00:00
- [ ] [Android] Video compression
2017-12-06 15:13:53 +00:00
2017-09-25 21:48:44 +00:00
## Contributors
This project exists thanks to all the people who contribute. [[Contribute]](CONTRIBUTING.md).
< a href = "graphs/contributors" > < img src = "https://opencollective.com/react-native-image-crop-picker/contributors.svg?width=890" / > < / a >
## Backers
Thank you to all our backers! 🙏 [[Become a backer ](https://opencollective.com/react-native-image-crop-picker#backer )]
< a href = "https://opencollective.com/react-native-image-crop-picker#backers" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/backers.svg?width=890" > < / a >
## Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor ](https://opencollective.com/react-native-image-crop-picker#sponsor )]
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/0/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/0/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/1/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/1/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/2/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/2/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/3/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/3/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/4/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/4/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/5/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/5/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/6/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/6/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/7/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/7/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/8/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/8/avatar.svg" > < / a >
< a href = "https://opencollective.com/react-native-image-crop-picker/sponsor/9/website" target = "_blank" > < img src = "https://opencollective.com/react-native-image-crop-picker/sponsor/9/avatar.svg" > < / a >
2016-05-18 10:07:36 +00:00
## License
*MIT*