Swift 一个像素对一个像素的相机馈送尺寸
这是一个相当奇怪的要求,但我正在寻找建立一个应用程序,有一个现场摄像机饲料占据整个屏幕。但是,不是显示正常分辨率,而是显示一种颜色。特别是,我想采用通常情况下屏幕中间像素的颜色,并使其占据整个屏幕。这需要现场快速完成Swift 一个像素对一个像素的相机馈送尺寸,swift,avfoundation,Swift,Avfoundation,这是一个相当奇怪的要求,但我正在寻找建立一个应用程序,有一个现场摄像机饲料占据整个屏幕。但是,不是显示正常分辨率,而是显示一种颜色。特别是,我想采用通常情况下屏幕中间像素的颜色,并使其占据整个屏幕。这需要现场快速完成 我试图制作一个函数,将capturesession保存为uiimage,然后从中获取像素数据,但是,它的实时速度很慢。有什么建议吗?假设您有AVCaptureSession设置。您需要设置AVCaptureVideoDataOutput,然后设置其示例缓冲区委托。委托类应该重写函数
我试图制作一个函数,将capturesession保存为uiimage,然后从中获取像素数据,但是,它的实时速度很慢。有什么建议吗?假设您有AVCaptureSession设置。您需要设置AVCaptureVideoDataOutput,然后设置其示例缓冲区委托。委托类应该重写函数captureOutput(AVCaptureOutput!、CMSampleBuffer!、AVCaptureConnection!)。在该功能中,您可以访问像素缓冲区以对中心点进行采样。你可以按下面的方法做。我把中心点的实际采样留给你了
class MyClass : NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {
func addVideoOutput() {
// Add video data output.
if session.canAddOutput(videoDataOutput)
{
videoDataOutput.setSampleBufferDelegate(self, queue: sessionQueue)
videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as NSString:Int(kCVPixelFormatType_32BGRA)]
videoDataOutput.alwaysDiscardsLateVideoFrames = true
session.addOutput(videoDataOutput)
}
}
// AVCaptureVideoDataOutputSampleBufferDelegate
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
if let buffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
process(pixelBuffer: buffer)
}
}
func process(pixelBuffer: CVPixelBuffer) {
let sourceRowBytes = CVPixelBufferGetBytesPerRow( pixelBuffer );
let width = CVPixelBufferGetWidth( pixelBuffer );
let height = CVPixelBufferGetHeight( pixelBuffer );
let rt = CVPixelBufferLockBaseAddress( pixelBuffer, .readOnly );
if (rt == kCVReturnSuccess) {
...
Do your processing of the pixeldata here
...
CVPixelBufferUnlockBaseAddress(pixelBuffer, .readOnly)
}
}
private let session = AVCaptureSession()
private let sessionQueue = DispatchQueue(label: "session queue", attributes: [], target: nil) // Communicate with the session
private let videoDataOutput = AVCaptureVideoDataOutput()
}
我只使用相机应用程序本身来捕捉图像,但也许你可以(1)计算出你需要的精确像素,(2)使用相机设备实时捕捉图像-如果可能的话,通过类似的方式()我认为你可以,然后(3)使用CoreGraphics或CoreImage将其绘制为“图像”-您可以轻松将其转换为UIImage。