React Native Camera:访问捕捉的图像

Posted

技术标签:

【中文标题】React Native Camera:访问捕捉的图像【英文标题】:React Native Camera: Access snapped image 【发布时间】:2018-05-16 14:42:25 【问题描述】:

我在我的应用程序中使用 react-native-camera 插件。我正在尝试拍摄一张图片,然后立即通过 AWS Amplify 将其上传到 AWS S3 存储桶。

我的代码如下所示:

export default class Camera extends Component 
render() 
    return (
        <View style=styles.container>
            <RNCamera
                ref=ref => 
                    this.camera = ref;
                
                style=styles.preview
                flashMode=RNCamera.Constants.FlashMode.auto
                permissionDialogTitle='Permission to use camera'
                permissionDialogMessage='We need your permission to use your phone\'s camera'
            />
            <TouchableOpacity
                onPress=this.takePicture.bind(this)
                style=styles.capture
            >
                <Text style=fontSize: 15> SNAP </Text>
            </TouchableOpacity>
        </View>
    );


takePicture = async function () 
    if (this.camera) 
        const options = base64: true;
        const data = await this.camera.takePictureAsync(options);
        console.log(data.uri);
        uploadPictureToS3(data.uri, "image.jpg");
    
;


function readFile(fileUri) 
    return RNFetchBlob.fs.readFile(fileUri, 'base64').then(data => new Buffer(data, 'base64'));


function uploadPictureToS3(uri, key) 
    readFile(uri).then(buffer => 
        Storage.put(key, buffer, 
            contentType: "image/jpeg"
        )
    )
        .then(r => 
            console.log(r);
        )
        .catch(e => 
        console.error(e);
    );

尝试使用 readFile 方法访问文件时出现以下错误:错误:文件不存在。

这里发生了什么?为什么拍摄后无法直接从缓存文件夹中读取图像?

【问题讨论】:

【参考方案1】:

尽管有一些“奇怪”的东西,您的代码看起来还不错。

您将选项 base64 传递给 takePictureAsync。这使相机返回自动拍摄的图片的base64,但您不会将其用于任何事情。你可以做 uploadPictureToS3(data.base64, "image.jpg"); 并跳过 readFile 方法。

还有一点,不知道为什么会这样,从我们通常做的uri中获取图片base64: const filepath = data.uri.split('//')[1]; const imageUriBase64 = await RNFS.readFile(filepath, 'base64');

所以试试const filepath = data.uri.split('//')[1]; 技巧,而不是直接传递data.uri。

【讨论】:

感谢您的回复。最初直接使用 data.base64 似乎可以工作,但是,我无法从 S3 打开上传的图像。在我的 Mac 上预览告诉我文件已损坏或格式不受支持。使用另一个选项似乎有效,尽管我收到一个新错误,告诉我未定义“缓冲区”。这里有什么想法吗? 抱歉耽搁了。您可能需要添加前缀“data:image/jpeg;base64,$IMAGE_BASE64_STRING”,因此请尝试将“data:image/jpeg;base64”前缀添加到生成的 base64 字符串中,看看是否有任何效果 你拯救了我的一天兄弟!找了一天这个答案。【参考方案2】:

我在这个应用程序中使用了 RNCamera 插件,此代码显示应用程序中的摄像头图像钉

import React,  Component  from 'react';
import  StyleSheet, Text, TouchableOpacity, View, Image  from 'react-native';
import  RNCamera  from 'react-native-camera';

export default class CameraPage extends Component 
    constructor(props) 
        super(props);
        this.state = 
          img : '',
      
    
    takePicture = async function(camera) 
        const options =  quality: 0.5, base64: true ;
        const data = await camera.takePictureAsync(options);

        this.setState(
          img: data.uri
        )        
      ;    
  render() 
    constimg= this.state;
    return (
      <View style=styles.container>
        <RNCamera
          style=styles.preview
          type=RNCamera.Constants.Type.back
          flashMode=RNCamera.Constants.FlashMode.off
          permissionDialogTitle='Permission to use camera'
          permissionDialogMessage='We need your permission to use your camera phone'
        >
          ( camera) => 

            return (
              <View style= flex: 0, flexDirection: 'row', justifyContent: 'center' >
                <TouchableOpacity onPress=() => this.takePicture(camera) style=styles.capture>
                  <Text style= fontSize: 14 > SNAP </Text>
                </TouchableOpacity>                
              </View>
            );
          
        </RNCamera>
        <View style=flex:1,justifyContent: 'center', alignItems: 'center'>          
            <Image  source=uri:img style=  width: 200, height: 200/>
        </View>
      </View>
    );
  




const styles = StyleSheet.create(
  container: 
    flex: 1,
    flexDirection: 'column',
    backgroundColor: 'black',
  ,
  preview: 
    flex: 2,
    justifyContent: 'flex-end',
    alignItems: 'center',
  ,
  capture: 
    flex: 0,
    backgroundColor: '#fff',
    borderRadius: 5,
    padding: 15,
    paddingHorizontal: `**enter code here**`20,
    alignSelf: 'center',
    margin: 20,
  ,
);

【讨论】:

而不是 img : '', 使用 img : null, 并且它将正常工作

以上是关于React Native Camera:访问捕捉的图像的主要内容,如果未能解决你的问题,请参考以下文章

React-Native-Camera Amazon Kindle 7 (5.1.1) 后置摄像头捕捉到纯绿色

如何访问 react-native-camera 的视频功能?

使用 react-native-camera,如何访问保存的图片?

`react-native-camera` 返回 data.uri 但无法访问图像(没有这样的文件或目录)

在首先按下不允许后如何授予对 react-native-camera 的访问权限?

如何使用 react-native-camera 捕获图片