Используйте CIDocumentEnhancer CIFilter в приложении macOS - PullRequest
0 голосов
/ 14 июля 2020

Я работаю над приложением 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 объект, я не думаю, что это проблема.

...