UNPKG

react-native-image-crop-picker

Version:
265 lines (201 loc) 31.4 kB
# react-native-image-crop-picker [![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) <img src="svg.svg" width="50%" height="50%" /> iOS/Android image picker with support for camera, video, configurable compression, multiple images and cropping ## Result <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_v2.png"> <img width=200 title="iOS Multiple Pick" src="https://github.com/ivpusic/react-native-image-crop-picker/blob/master/images/ios_multiple_pick_v2.png"> <img width=200 title="iOS Crop Normal" src="https://github.com/ivpusic/react-native-image-crop-picker/blob/master/images/ios_normal_crop.png"> <img width=200 title="iOS Crop Circular" src="https://github.com/ivpusic/react-native-image-crop-picker/blob/master/images/ios_circular_crop.png"> </p> ## Important notes - If you are using react-native new architecture, you have to use react-native-image-crop-picker version >= 0.50.0 ## Usage Import library ```javascript import ImagePicker from "react-native-image-crop-picker"; ``` ### Select from gallery Call single image picker with cropping ```javascript ImagePicker.openPicker({ width: 300, height: 400, cropping: true, }).then((image) => { console.log(image); }); ``` Call multiple image picker ```javascript ImagePicker.openPicker({ multiple: true, }).then((images) => { console.log(images); }); ``` Select video only from gallery ```javascript ImagePicker.openPicker({ mediaType: "video", }).then((video) => { console.log(video); }); ``` **Android: The prop 'cropping' has been known to cause videos not to be displayed in the gallery on Android. Please do not set cropping to true when selecting videos.** ### Select from camera #### Image ```javascript ImagePicker.openCamera({ width: 300, height: 400, cropping: true, }).then((image) => { console.log(image); }); ``` #### Video ```javascript ImagePicker.openCamera({ mediaType: "video", }).then((image) => { console.log(image); }); ``` ### Crop picture ```javascript ImagePicker.openCropper({ path: "my-file-path.jpg", width: 300, height: 400, }).then((image) => { console.log(image); }); ``` ### Optional cleanup 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); }); ``` ### Request Object | Property | Type | Description | | ----------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 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 | | writeTempFile (ios only) | bool (default true) | When set to false, does not write temporary files for the selected images. This is useful to improve performance when you are retrieving file contents with the `includeBase64` option and don't need to read files from disk. | | includeBase64 | bool (default false) | When set to true, the image file content will be available as a base64-encoded string in the `data` property. Hint: To use this string as an image source, use it like: ``<Image source={{uri: `data:${image.mime};base64,${image.data}`}} />`` | | includeExif | bool (default false) | Include image exif data in the response | | avoidEmptySpaceAroundImage (ios only) | bool (default true) | When set to true, the image will always fill the mask space. | | 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. | | cropperToolbarWidgetColor (android only) | string (default `darker orange`) | When cropping image, determines the color of Toolbar text and buttons. | | freeStyleCropEnabled | bool (default false) | Enables user to apply custom rectangle area for cropping | | cropperToolbarTitle | string (default `Edit Photo`) | When cropping image, determines the title of Toolbar. | | cropperCircleOverlay | bool (default false) | Enable or disable circular cropping mask. | | disableCropperColorSetters (android only) | bool (default false) | When cropping image, disables the color setters for cropping library. | | minFiles (ios only) | number (default 1) | Min number of files to select when using `multiple` option | | maxFiles | 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 | | 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 | | useFrontCamera | bool (default false) | Whether to default to the front/'selfie' camera when opened. Please note that not all Android devices handle this parameter, see [issue #1058](https://github.com/ivpusic/react-native-image-crop-picker/issues/1058) | | 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 (Android)/0.8 (iOS)) | Compress image with quality (from 0 to 1, where 1 is best quality). On iOS, values larger than 0.8 don't produce a noticeable quality increase in most images, while a value of 0.8 will reduce the file size by about half or less compared to a value of 1. | | 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 | | sortOrder (ios only) | string (default 'none', supported values: 'asc', 'desc', 'none') | Applies a sort order on the creation date on how media is displayed within the albums/detail photo views when opening the image picker | | forceJpg (ios only) | bool (default false) | Whether to convert photos to JPG. This will also convert any Live Photo into its JPG representation | | showCropGuidelines (android only) | bool (default true) | Whether to show the 3x3 grid on top of the image during cropping | | showCropFrame (android only) | bool (default true) | Whether to show crop frame 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 | | cropperChooseText (ios only)  |           string (default choose)         | Choose button text | | cropperChooseColor (ios only) | string (default `#FFCC00`) | HEX format color for the Choose button. [Default color is controlled by TOCropViewController](https://github.com/TimOliver/TOCropViewController/blob/a942414508012b13102f776eb65dac655f31cabb/Objective-C/TOCropViewController/Views/TOCropToolbar.m#L444). | | cropperCancelText (ios only) | string (default Cancel) | Cancel button text | | cropperCancelColor (ios only) | string (default tint `iOS` color ) | HEX format color for the Cancel button. Default value is the default tint iOS color [controlled by TOCropViewController](https://github.com/TimOliver/TOCropViewController/blob/a942414508012b13102f776eb65dac655f31cabb/Objective-C/TOCropViewController/Views/TOCropToolbar.m#L433) | | cropperRotateButtonsHidden (ios only)  |           bool (default false)         | Enable or disable cropper rotate buttons | #### Smart Album Types (ios) NOTE: Some of these types may not be available on all iOS versions. Be sure to check this to avoid issues. ``` ['PhotoStream', 'Generic', 'Panoramas', 'Videos', 'Favorites', 'Timelapses', 'AllHidden', 'RecentlyAdded', 'Bursts', 'SlomoVideos', 'UserLibrary', 'SelfPortraits', 'Screenshots', 'DepthEffect', 'LivePhotos', 'Animated', 'LongExposure'] ``` ### Response Object | Property | Type | Description | | ------------------------- | :----: | :------------------------------------------------------------------------------------- | | path | string | Selected image location. This is null when the `writeTempFile` option is set to false. | | 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 | 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 | | duration | number | Video duration time in milliseconds | | data | base64 | Optional base64 selected file representation | | exif | object | Extracted exif data from image. Response format is platform specific | | cropRect | object | Cropped image rectangle (width, height, x, y) | | creationDate (ios only) | string | UNIX timestamp when image was created | | modificationDate | string | UNIX timestamp when image was last modified | # Install ## Step 1 ```bash npm i react-native-image-crop-picker --save ``` ## Step 2 ### iOS ```bash cd ios pod install ``` ## Step 3 ### iOS #### Step 1 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. #### (Optional) Step 2 - To localize the camera / gallery / cropper text buttons - Open your Xcode project - Go to your project settings by opening the project name on the Navigation (left side) - Select your project in the project list - Should be into the Info tab and add in Localizations the language your app was missing throughout the + - Rebuild and you should now have your app camera and gallery with the classic ios text in the language you added. ### Android - [Optional] If you want to use camera picker in your project, add following to `app/src/main/AndroidManifest.xml` - `<uses-permission android:name="android.permission.CAMERA"/>` - [Optional] If you want to use front camera, also add following to `app/src/main/ AndroidManifest.xml` - `<uses-feature android:name="android.hardware.camera" android:required="false" />` - `<uses-feature android:name="android.hardware.camera.front" android:required="false" />` ## TO DO - [ ] [Android] Standardize multiple select - [ ] [Android] Video compression ## 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> ## License _MIT_