Я работаю над приложением SwiftUI для macOS, которое должно обрабатывать отсканированные изображения. Чтобы улучшить изображения, я хочу использовать CIDocumentEnhancer
CIFilter, поскольку он должен быть доступен в macOS 10.15+ (согласно документации Apple здесь ; он также должен быть доступен для устройств с iOS 13 или новее). Однако код, который я написал для преобразования NSImage
в CIImage
, к которому затем применяется CIFilter
, а получившееся изображение отображается в NSImageView
или преобразуется в Data
, вылетает при запуске с Xcode, что приводит к следующему сообщению об ошибке:
-[MTLDebugComputeCommandEncoder dispatchThreadgroups:threadsPerThreadgroup:]:940: failed assertion `(threadgroupsPerGrid.width(1) * threadgroupsPerGrid.y(0) * threadgroupsPerGrid.depth(1))(0) must not be 0.'
При запуске напрямую без подключенного отладчика Xcode приложение просто зависает при закреплении одного ядра ЦП на 100%. Такое поведение наблюдается как на iMa c 5K, так и на недавнем MacBook Pro.
Я также пробовал тот же код (конечно, адаптированный для iOS) на iPhone с iOS 13.5, где он работает достаточно хорошо (хотя с абсурдно высоким использованием ОЗУ, около 1,6 ГБ или больше).
Кто-нибудь имеет опыт работы с CIFilter
s на macOS и может помочь мне с моей проблемой?
Это код, который вылетает в macOS:
guard let imageData = self.image.tiffRepresentation,
let bitmapRep = NSBitmapImageRep(data: imageData),
let image = CIImage(bitmapImageRep: bitmapRep),
let filter = CIFilter(name: "CIDocumentEnhancer") else {
return
}
filter.setValue(image, forKey: kCIInputImageKey)
filter.setValue(NSNumber(value: 2.0), forKey: kCIInputAmountKey)
guard let outputImage = filter.outputImage else {
return
}
let context = CIContext(options: nil)
guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else {
return
}
let nsimage = NSImage(cgImage: cgImage, size: outputImage.extent.size)
self.imageView.image = nsimage
Я также пробовал разные способы конвертировать outputImage
обратно в NSImage
, так как приложение также вылетает, когда пытаясь преобразовать CIImage
в Data
объект, я не думаю, что это проблема.