2015-06-04 26 views
7

Kullanıcıların PhotoKit kullanarak fotoğrafları düzenlemelerine izin veren bir uygulama geliştiriyorum. Düzenlenmiş olan fotoğrafı daha önce bir JPEG olarak diske kaydettim. Ben JPEG'e dönüştürmekten kaçınmak ve bunu yapmak için değişiklikleri uygulamaya koymak istiyorum. Fotoğraf makinesiyle çekilen fotoğraflar için harika çalışır, ancak bir ekran görüntüsünü düzenlemeye çalışırsanız, PHPhotoLibrary.sharedPhotoLibrary().performChanges bloğu başarısız olur ve The operation couldn’t be completed. (Cocoa error -1.)'u günlüğe kaydeder. Bunun neden performChanges bloğunun başarısız olmasına neden olduğundan emin değilim, neyi yanlış yaptım?Ekran görüntüleri düzenlenemiyor, performChanges bloğu başarısız oluyor

Bu sorunu gösteren bir sample app available to download oluşturdum ve aşağıdaki ilgili kodu ekledim. Uygulama, fotoğraf arşivinizdeki en yeni fotoğrafı düzenlemeye çalışır. Başarılı olursa fotoğrafı düzenlemek için erişim istenir, aksi halde hiçbir şey olmaz ve konsol günlüğünü görürsünüz. Sorunu yeniden oluşturmak için bir ekran görüntüsü alın ve uygulamayı çalıştırın. ekran görüntüleri ile çalışır

Güncel kodu:

let jpegData: NSData = outputPhoto.jpegRepresentationWithCompressionQuality(0.9) 

let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input) 

var error: NSError? 
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error) 
if success { 
    return contentEditingOutput 
} else { 
    return nil 
} 

Yedek kod ekran başarısız olmasına neden olur:

let url = self.input.fullSizeImageURL 
let orientation = self.input.fullSizeImageOrientation 
var inputImage = CIImage(contentsOfURL: url) 
inputImage = inputImage.imageByApplyingOrientation(orientation) 

let outputPhoto = createOutputImageFromInputImage(inputImage)! 

let originalImageData = NSData(contentsOfURL: self.input.fullSizeImageURL)! 
let imageSource = CGImageSourceCreateWithData(originalImageData, nil) 

let dataRef = CFDataCreateMutable(nil, 0) 
let destination = CGImageDestinationCreateWithData(dataRef, CGImageSourceGetType(imageSource), 1, nil) //getType automatically selects JPG, PNG, etc based on original format 

struct ContextStruct { 
    static var ciContext: CIContext? = nil 
} 
if ContextStruct.ciContext == nil { 
    let eaglContext = EAGLContext(API: .OpenGLES2) 
    ContextStruct.ciContext = CIContext(EAGLContext: eaglContext) 
} 

let cgImage = ContextStruct.ciContext!.createCGImage(outputPhoto, fromRect: outputPhoto.extent()) 

CGImageDestinationAddImage(destination, cgImage, nil) 

if CGImageDestinationFinalize(destination) { 
    let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input) 

    var error: NSError? 
    let imageData: NSData = dataRef 
    let success = imageData.writeToURL(contentEditingOutput.renderedContentURL, options: .AtomicWrite, error: &error) 
    if success { 
      //it does succeed 
      return contentEditingOutput 
    } else { 
      return nil 
    } 
} 

cevap

0

sorun nedeniyle düzeltilmiş fotoğraflar hep JPG dosyaları olarak kaydedilir gerçeğine olur, ve ekran görüntüleri aslında PNG dosyalarıdır.

Ben senin örnek proje ayıklarken iken aklıma ve PhotoEditor gördüm, contentEditingOutput.renderedContentURL sen CGImageSourceGetType(imageSource) sonucunu incelemek eğer ederken bunun bir PNG (PNG İYE döndürür var açıktır, bir JPG bir URL : public.png).

için documentation'u okudum ve okuduğumda, bir fotoğraf öğesinin düzenlenmesi durumunda, değiştirilen görüntünün JPEG biçiminde yazıldığını, bu da görüntünüzün PNG olması durumunda işe yaramayacağını belirtir. Bu, Apple'ın PNG dosyalarını düzenlemeyi desteklemediğini veya sizi istemediğini düşünmeme neden oluyor. Git rakam ..

+0

Apple ile bir hata kaydettim. Bu hata iOS 9 ve 10'da da var. Açıkçası onlar düzeltmek için yüksek bir öncelik değil. – jjxtra