我有一个相机预览,效果很好.我想截取它的屏幕截图及其上的所有内容.但是,由于通常的截图方法:CALayer的renderInContext不会从相机渲染内容,我需要单独添加它. 我在视图中使用此功能控
我在视图中使用此功能控制器捕获图像并将其保存到相机胶卷.
@IBAction func snapStillImage(sender: AnyObject) { print("snapStillImage") (self.previewView.layer as! AVCaptureVideoPreviewLayer).connection.enabled=false; dispatch_async(self.sessionQueue, { // Update the orientation on the still image output video connection before capturing. let videoOrientation = (self.previewView.layer as! AVCaptureVideoPreviewLayer).connection.videoOrientation self.stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = videoOrientation // Flash set to Auto for Still Capture ViewController.setFlashMode(AVCaptureFlashMode.Auto, device: self.videoDeviceInput!.device) self.stillImageOutput!.captureStillImageAsynchronouslyFromConnection(self.stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo), completionHandler: { (imageDataSampleBuffer: CMSampleBuffer!, error: NSError!) in if error == nil { let data:NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer) let image:UIImage = UIImage( data: data)! let libaray:ALAssetsLibrary = ALAssetsLibrary() let orientation: ALAssetOrientation = ALAssetOrientation(rawValue: image.imageOrientation.rawValue)! libaray.writeImageToSavedPhotosAlbum(image.CGImage, orientation: orientation, completionBlock: nil) print("save to album") }else{ // print("Did not capture still image") print(error) } }) }) }
我想返回使用let image定义的图像:UIImage = UIImage(数据:数据)!
以便通过以下功能访问它
@IBAction func downloadButton(sender: UIButton) { //Create the UIImage UIGraphicsBeginImageContextWithOptions(previewView.frame.size, false, 0.0) previewView.layer.renderInContext(UIGraphicsGetCurrentContext()!) //ALSO ADD image captured with captureStillImageAsynchronouslyFromConnection right here to the context. let image = UIGraphicsGetImageFromCurrentImageContext() //Save it to the camera roll UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) }
这将让我的屏幕截图包含最近捕获的图像以及添加了UIGraphicsGetCurrentContext()的所有内容!
我听说您通过将图像包含在captureStillImageAsynchronouslyFromConnection函数中已包含的完成处理程序块中来完成此操作,但我不太清楚如何执行此操作.有什么建议?
您可以将捕获的静止图像添加为UIImage作为previewView的子视图.然后调用renderInContext.假设这个代码都在同一个类中进行,你可以使image成为一个属性
class CameraViewController: UIViewController { var image: UIImage! ...
然后在captureStillImageAsynchronouslyFromConnection中
代替
let image:UIImage = UIImage( data: data)!
使用
self.image = UIImage( data: data)!
然后在downloadButton中使用
var imageView = UIImageView(frame: previewView.frame) imageView.image = self.image previewView.addSubview(imageView) previewView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
然后,您可以根据需要删除imageView
imageView.removeFromSuperview()