2015-06-04 17 views
7

Tôi đang phát triển một ứng dụng cho phép người dùng chỉnh sửa ảnh bằng PhotoKit. Trước đây tôi đã lưu ảnh đã chỉnh sửa vào đĩa dưới dạng JPEG. Tôi muốn tránh chuyển đổi sang JPEG và đã thực hiện các sửa đổi để thực hiện điều đó. Nó hoạt động tốt cho các bức ảnh chụp bằng máy ảnh, nhưng nếu bạn cố chỉnh sửa ảnh chụp màn hình, khối PHPhotoLibrary.sharedPhotoLibrary().performChanges sẽ không thành công và đăng nhập The operation couldn’t be completed. (Cocoa error -1.). Tôi không chắc tại sao điều này lại khiến khối performChanges thất bại, tôi đã làm gì sai ở đây?Không thể chỉnh sửa ảnh chụp màn hình, khối PerformChanges không thành công

Tôi đã tạo một sample app available to download trình bày sự cố và tôi đã bao gồm mã có liên quan bên dưới. Ứng dụng này cố gắng chỉnh sửa ảnh mới nhất trong thư viện ảnh của bạn. Nếu thành công, nó sẽ nhắc truy cập để chỉnh sửa ảnh, nếu không sẽ không có gì xảy ra và bạn sẽ thấy nhật ký bảng điều khiển. Để tái tạo sự cố, chụp ảnh màn hình rồi chạy ứng dụng.

mã hiện làm việc với ảnh chụp màn hình: Mã

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 
} 

thay thế gây ảnh chụp màn hình để thất bại:

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 
    } 
} 

Trả lời

0

Vấn đề xảy ra do thực tế rằng hình ảnh đã được điều chỉnh luôn lưu lại dưới dạng file JPG, và ảnh chụp màn hình thực tế là tệp PNG. Nó xảy ra với tôi trong khi tôi đang gỡ lỗi dự án mẫu của bạn và thấy trong PhotoEditor, contentEditingOutput.renderedContentURL là một URL đến JPG, trong khi nếu bạn kiểm tra kết quả của CGImageSourceGetType(imageSource) thì rõ ràng đó là một PNG (trả về PNG UTI) : public.png).

Vì vậy, tôi đã đọc và đọc documentation cho renderedContentURL tuyên bố rằng nếu chỉnh sửa nội dung ảnh, hình ảnh thay đổi được ghi ở định dạng JPEG - điều này sẽ không hoạt động nếu hình ảnh của bạn là PNG. Điều này khiến tôi nghĩ rằng Apple không hỗ trợ chỉnh sửa các tệp PNG hoặc không muốn bạn. Xem hình ..

+0

Tôi đã đăng lỗi với Apple. Lỗi này cũng tồn tại trong iOS 9 và 10. Rõ ràng không phải là một ưu tiên cao cho họ để sửa chữa. – jjxtra

Các vấn đề liên quan