2016-08-31 21 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を指定する必要がありました。実際のDNGデータを検索するのではなく、DNGデータからJPEGサムネイル表現を取得するだけでした。これで、このオプションが用意されているので、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 せ画像データ= AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer:rawSampleBuffer!previewPhotoSampleBuffer:previewPhotoSampleBuffer) せciRawFilter = CIFilter(画像データ:!画像データのデータとして、オプション:ゼロ) ' –

+0

@ダンヒクソン、私はまた、あなた自身の答えで述べたような生のフィルターを作成していた。私はkCGImageSourceTypeIdentifierHintを使用していました。私はそれが鍵であることを知らなかった。私はappleのrawExposeサンプルアプリケーションをまねしました。情報のおかげで。私はしばらくメール/サイトをチェックしなかったので、早めに返信しないでください。 – nav1729

関連する問題