2016-08-31 2 views
3

У меня есть следующий код для сохранения RAW-изображения в формате JPEG для рулона камеры, но у него есть три проблемы: 1) это зеркальное изображение, 2) оно повернуто на 90 градусов, и 3) это низкое разрешение.iOS 10 Сохранить RAW Фотокамера в камере

// In my PhotoCaptureDelegate 
func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingRawPhotoSampleBuffer rawSampleBuffer: CMSampleBuffer?,  previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings:  AVCaptureBracketedStillImageSettings?, error: Error?) { 

    if (rawSampleBuffer != nil) { 
    let temporaryDNGFileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(resolvedSettings.uniqueID)lld.dng")! 
    let temporaryJPGFileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(resolvedSettings.uniqueID)lld.jpg")! 
    let imageData = AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer: rawSampleBuffer!, previewPhotoSampleBuffer:  previewPhotoSampleBuffer) 


    try! imageData?.write(to: temporaryDNGFileURL) 
    PHPhotoLibrary.requestAuthorization({ (status) in 
     if status == .authorized { 
      PHPhotoLibrary.shared().performChanges({ 

      let options = PHAssetResourceCreationOptions() 
      options.shouldMoveFile = true 
      //Write Raw: 
      PHAssetCreationRequest.forAsset().addResource(with: .photo, fileURL: temporaryDNGFileURL, options: options) 

        // Process Raw to JPG 
        if let ciRawFilter = CIFilter(imageData: imageData! as Data, options: nil) { 
         let cs = CGColorSpace(name: CGColorSpace.displayP3)! 
         do { 
          try self.contextForSaving.writeJPEGRepresentation(of: ciRawFilter.outputImage!, to: temporaryJPGFileURL, colorSpace: cs, options: [ kCGImageDestinationLossyCompressionQuality as String: 1.0]) 
          PHAssetCreationRequest.forAsset().addResource(with: .photo, fileURL: temporaryJPGFileURL, options: options) 
         } catch _ { 
          print("error with jpeg conversion") 
         } 

        } 
      }, completionHandler: { [unowned self] success, error in 
       if let error = error { 
       print("Error occurered while saving photo to photo library: \(error)") 
       } else { 
       print("Raw photo written to photo library.") 
       } 

       if FileManager.default.fileExists(atPath: temporaryDNGFileURL.path) { 
       do { 
        (try FileManager.default.removeItem(at: temporaryDNGFileURL)) 
       } 
       catch _ { 
        print("could not remove temporary file") 
       } 
       } 
       self.didFinish() 
      } 
     ) 
     } 
     else { 
      self.didFinish() 
     } 
    }) 
    } else { 
    print("Error capturing photo: \(error)") 
    } 
} 

Я знаю, как захватить JPEG напрямую, но я сначала пытаюсь применить некоторые пользовательские фильтры к RAW-данным.

enter image description here

Пожалуйста, помогите, если вы можете, заранее спасибо!

ответ

2

Мне нужно было указать kCGImageSourceTypeIdentifierHint. Он просто хватал представление миниатюр JPEG из данных DNG, а не искал фактические данные DNG. Теперь, когда у меня есть эта опция, файл JPEG будет полноразмерным и правильно ориентированным.

let imageData = AVCapturePhotoOutput.dngPhotoDataRepresentation(
       forRawSampleBuffer: rawSampleBuffer!, 
       previewPhotoSampleBuffer: previewPhotoSampleBuffer) 
let rawOptions = [String(kCGImageSourceTypeIdentifierHint): "com.adobe.raw-image"] 
if let ciRawFilter = CIFilter(imageData: imageData! as Data, options: rawOptions) { 
    // raw Filters and stuff go here, then handle outputImage 
} 
3

Я проверил следующий код, чтобы сохранить выходное изображение из необработанного фильтра в формате jpeg с правильной ориентацией и разрешением. измените качество jpeg и укажите цветовое пространство в соответствии с вашими требованиями. Надеюсь, это поможет вам.

guard let opCiImage:CIImage = rawFilter!.outputImage else { 
     print("Error in creating raw filter output") 
     return 
    } 
    let dumpingContext:CIContext = CIContext(options: [kCIContextCacheIntermediates:false, 
                 kCIContextPriorityRequestLow:false]) 



    //Convert to CGImage and then dump into a jpeg 
    let opCgImage = dumpingContext.createCGImage(opCiImage, 
                from: opCiImage.extent, 
                format: kCIFormatARGB8, 
                colorSpace: CGColorSpace(name: CGColorSpace.sRGB), 
                deferred: false) 
    let uImage = UIImage(cgImage: opCgImage!) 
    guard let opImgData:Data = UIImageJPEGRepresentation(uImage, 0.95) else { return } 

, пожалуйста, дайте мне знать отзывы в комментариях.

+0

спасибо @ nav1729! Можете ли вы создать резервную копию нескольких строк и показать мне, как вы создали rawFilter? То, что я делаю, похоже, не работает для меня. Я все еще получаю вверх стороной вниз 640x852 пусть ImageData = AVCapturePhotoOutput.dngPhotoDataRepresentation (forRawSampleBuffer: rawSampleBuffer !, previewPhotoSampleBuffer: previewPhotoSampleBuffer) пусть ciRawFilter = CIFilter (ImageData: ImageData как данные, параметры: ноль) ' –

+0

@DanHixon, я также создавал сырой фильтр, как вы упомянули в своем собственном ответе. Я использовал kCGImageSourceTypeIdentifierHint. Я не знал, что это ключ. Я просто подражал образцу приложения appleexpose apple. Спасибо за информацию. Извините, что не отвечал ранее, так как я не проверял почту/сайты в течение некоторого времени. – nav1729

Смежные вопросы