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