import React, {Component} from 'react'; import { View, Text, StyleSheet, ScrollView, Alert, Image, TouchableOpacity, NativeModules, Dimensions } from 'react-native'; import Video from 'react-native-video'; var ImagePicker = NativeModules.ImageCropPicker; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center' }, button: { backgroundColor: 'blue', marginBottom: 10 }, text: { color: 'white', fontSize: 20, textAlign: 'center' } }); export default class App extends Component { constructor() { super(); this.state = { image: null, images: null }; } pickSingleWithCamera(cropping) { ImagePicker.openCamera({ cropping: cropping, width: 500, height: 500, includeExif: true, }).then(image => { console.log('received image', image); this.setState({ image: {uri: image.path, width: image.width, height: image.height}, images: null }); }).catch(e => alert(e)); } pickSingleBase64(cropit) { ImagePicker.openPicker({ width: 300, height: 300, cropping: cropit, includeBase64: true, includeExif: true, }).then(image => { console.log('received base64 image'); this.setState({ image: {uri: `data:${image.mime};base64,`+ image.data, width: image.width, height: image.height}, images: null }); }).catch(e => alert(e)); } cleanupImages() { ImagePicker.clean().then(() => { console.log('removed tmp images from tmp directory'); }).catch(e => { alert(e); }); } cleanupSingleImage() { let image = this.state.image || (this.state.images && this.state.images.length ? this.state.images[0] : null); console.log('will cleanup image', image); ImagePicker.cleanSingle(image ? image.uri : null).then(() => { console.log(`removed tmp image ${image.uri} from tmp directory`); }).catch(e => { alert(e); }) } cropLast() { if (!this.state.image) { return Alert.alert('No image', 'Before open cropping only, please select image'); } ImagePicker.openCropper({ path: this.state.image.uri, width: 200, height: 200 }).then(image => { console.log('received cropped image', image); this.setState({ image: {uri: image.path, width: image.width, height: image.height, mime: image.mime}, images: null }); }).catch(e => { console.log(e); Alert.alert(e.message ? e.message : e); }); } pickSingle(cropit, circular=false) { ImagePicker.openPicker({ width: 300, height: 300, cropping: cropit, cropperCircleOverlay: circular, compressImageMaxWidth: 640, compressImageMaxHeight: 480, compressImageQuality: 0.5, compressVideoPreset: 'MediumQuality', includeExif: true, }).then(image => { console.log('received image', image); this.setState({ image: {uri: image.path, width: image.width, height: image.height, mime: image.mime}, images: null }); }).catch(e => { console.log(e); Alert.alert(e.message ? e.message : e); }); } pickMultiple() { ImagePicker.openPicker({ multiple: true, waitAnimationEnd: false, includeExif: true, }).then(images => { this.setState({ image: null, images: images.map(i => { console.log('received image', i); return {uri: i.path, width: i.width, height: i.height, mime: i.mime}; }) }); }).catch(e => alert(e)); } scaledHeight(oldW, oldH, newW) { return (oldH / oldW) * newW; } renderVideo(video) { return ( ); } renderImage(image) { return } renderAsset(image) { if (image.mime && image.mime.toLowerCase().indexOf('video/') !== -1) { return this.renderVideo(image); } return this.renderImage(image); } render() { return ( {this.state.image ? this.renderAsset(this.state.image) : null} {this.state.images ? this.state.images.map(i => {this.renderAsset(i)}) : null} this.pickSingleWithCamera(false)} style={styles.button}> Select Single With Camera this.pickSingleWithCamera(true)} style={styles.button}> Select Single With Camera With Cropping this.pickSingle(false)} style={styles.button}> Select Single this.cropLast()} style={styles.button}> Crop Last Selected Image this.pickSingleBase64(false)} style={styles.button}> Select Single Returning Base64 this.pickSingle(true)} style={styles.button}> Select Single With Cropping this.pickSingle(true, true)} style={styles.button}> Select Single With Circular Cropping Select Multiple Cleanup All Images Cleanup Single Image ); } }