React Native:无需图像保存和预览的实时相机数据

Posted

技术标签:

【中文标题】React Native:无需图像保存和预览的实时相机数据【英文标题】:React native: Real time camera data without image save and preview 【发布时间】:2016-11-07 15:24:22 【问题描述】:

我开始开发我的第一个非演示型 react-native 应用程序。我希望它是一个 ios/android 应用,但实际上我只专注于 iOS。

其实我有一个问题。如何在不保存到相机胶卷的情况下从相机实时获取数据(base64、像素数组……)。

有这个模块:https://github.com/lwansbrough/react-native-camera 但 base64 已被弃用,对我来说没用,因为我想要一个渲染处理的图像给用户(例如更改图片颜色),而不是来自相机的真实图片,因为它确实反应 -原生相机模块。

(我知道如何与 SWIFT 代码通信,但我不知道原生代码中有哪些选项,我是从 WebDev 来的)

非常感谢。

【问题讨论】:

你确定base64已经贬值了吗?它仍然是文档中的一个选项... 您好,您找到解决实时图像数据而不保存的方法了吗? 【参考方案1】:

这可能不是最佳的,但这是我一直在使用的。如果有人可以提供更好的解决方案,我也将感谢您的帮助!

我的基本想法是简单地循环(但不是简单的 for 循环,见下文)以 yuv/rgb 格式以最大分辨率拍摄静态图片,这相当快(在正常曝光持续时间下约为 x0ms)并处理它们。基本上,您将设置链接到您的相机的 AVCaptureStillImageOutput(遵循随处可见的教程),然后将格式设置为 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange(如果您想要 YUV)或 kCVPixelFormatType_32BGRA(如果您更喜欢 rgba),如

bool usingYUVFormat = true;
NSDictionary *outputFormat = [NSDictionary dictionaryWithObject:
                [NSNumber numberWithInt:usingYUVFormat?kCVPixelFormatType_420YpCbCr8BiPlanarFullRange:kCVPixelFormatType_32BGRA]
                                           forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[yourAVCaptureStillImageOutput setOutputSettings:outputFormat];

准备好后,就可以开始调用了

AVCaptureConnection *captureConnection=[yourAVCaptureStillImageOutput connectionWithMediaType:AVMediaTypeVideo];
[yourAVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:captureConnection  completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
    if(imageDataSampleBuffer)
        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);
        CVPixelBufferLockBaseAddress(imageBuffer, 0);
        // do your magic with the data buffer imageBuffer
        // use CVPixelBufferGetBaseAddressOfPlane(imageBuffer,0/1/2); to get each plane
        // use CVPixelBufferGetWidth/CVPixelBufferGetHeight to get dimensions
        // if you want more, please google
    
];

此外,使用 NSNotificationCenter 注册您的拍照动作并在处理完每一帧后发布通知(可能会有一些延迟,以限制您的吞吐量并降低功耗),以便循环继续进行。

快速预防措施:Android 对手更令人头疼。正如我在my question 中提出的那样,很少有硬件制造商为最大分辨率的未压缩照片实现 api,但只有 1080p 用于预览/视频。我仍在寻找解决方案,但放弃了大部分希望。 JPEG 图像太慢了。

【讨论】:

您能找到更好的解决方案吗?

以上是关于React Native:无需图像保存和预览的实时相机数据的主要内容,如果未能解决你的问题,请参考以下文章

React Native / Expo - 将图像传递到预览屏幕

react-native中如何保存和显示和图像?

在 React Native 中保存和共享项目资产中的图像

React-native-camera 不想保存图像

具有变暗不透明度的文本叠加图像 React Native

使用 Expo 在 react-native 上共享图像和文件