CIFilters 似乎在 iOS 14、Swift 5.x 上损坏
CIFilters seems to be broken on on iOS 14, Swift 5.x
iOS 14.5,Swift 版本 5.4.2 (swiftlang-1205.0.28.2 clang-1205.0.19.57)
一直在试图弄清楚为什么这段代码不起作用?对于此 iOS/Swift 版本
,Xcode 上的模拟器是否简单地破坏了过滤器
private func generateMono(from image: UIImage) ->
UIImage {
let mono = CIFilter(name: "CIColorMonochrome")
mono!.setDefaults()
mono!.setValue(image.cgImage, forKey: "inputImage")
if let image = mono!.outputImage {
if let image = context.createCGImage(image, from: image.extent) {
return UIImage(cgImage: image)
}
}
return UIImage(systemName: "circle") ?? UIImage()
}
我 运行 收到此错误消息以及系统转储。
2021-07-13 09:17:45.910734+0200 GameV[32820:1828401] The filter 'CIPortraitEffectSpillCorrection' is not implemented in the bundle at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/CoreImage/PortraitFilters.cifilter.
2021-07-13 09:17:45.911776+0200 GameV[32820:1828401] Metal GPU Frame Capture Enabled
2021-07-13 09:17:45.912087+0200 GameV[32820:1828401] Metal API Validation Enabled
2021-07-13 09:17:46.363938+0200 GameV[32820:1828401] -[__NSCFType imageByUnpremultiplyingAlpha]: unrecognized selector sent to instance 0x7f941bd15700
2021-07-13 09:17:46.377114+0200 GameV[32820:1828401] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType imageByUnpremultiplyingAlpha]: unrecognized selector sent to instance 0x7f941bd15700'
我是不是漏掉了 read/do 明显不对的地方?使用此代码调用它?
import Foundation
import SpriteKit
import CoreImage.CIFilterBuiltins
class GameScene: SKScene {
var img:UIImage!
let context = CIContext(options: nil)
static var shared = GameScene()
override func didMove(to view: SKView) {
backgroundColor = .white
let mono = generateMono(from: uiImage!) as? UIImage
let tex = SKTexture(image: mono!)
let box = SKSpriteNode(texture: tex, size: CGSize(width: 64, height: 64))
box.position = CGPoint(x: 128, y: 128)
addChild(box)
}
}
谢谢
我在 SwiftUI 项目上使用这个 UIImage 扩展,它工作正常:
import CoreImage
import CoreImage.CIFilterBuiltins
extension UIImage {
func applyFilter() -> UIImage {
let beginImage = CIImage(image: self )
let context = CIContext()
let customFilter = CIFilter.colorMonochrome()
customFilter.inputImage = beginImage
customFilter.intensity = 1
guard let outputImage = customFilter.outputImage else { return UIImage() }
// attempt to get a CGImage from our CIImage
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let filteredImage = UIImage(cgImage: cgimg)
return filteredImage
}
return UIImage()
}
}
用法:
struct ContentView: View {
var body: some View {
Image(uiImage: (UIImage(named: "img3")?.applyFilter())!)
}
}
它在评论中,但这里是关于如何设置对 CIColorMonochrome
的调用的完整(且格式更好)的答案:
let filter = CIFilter(name: "CIColorMonochrome")
let context = CIContext()
var extent: CGRect!
var scaleFactor: CGFloat!
@IBOutlet weak var img: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let ciImage = CIImage(image: img.image!)
// Note: you may use kCIInputImageKey for inputImage
filter?.setValue(ciImage, forKey: "inputImage")
filter?.setValue(Float(1), forKey: "inputAngle")
let result = filter?.outputImage
var image = UIImage(cgImage: context.createCGImage(result!, from: result!.extent)!)
img.image = image
}
iOS 14.5,Swift 版本 5.4.2 (swiftlang-1205.0.28.2 clang-1205.0.19.57)
一直在试图弄清楚为什么这段代码不起作用?对于此 iOS/Swift 版本
,Xcode 上的模拟器是否简单地破坏了过滤器private func generateMono(from image: UIImage) ->
UIImage {
let mono = CIFilter(name: "CIColorMonochrome")
mono!.setDefaults()
mono!.setValue(image.cgImage, forKey: "inputImage")
if let image = mono!.outputImage {
if let image = context.createCGImage(image, from: image.extent) {
return UIImage(cgImage: image)
}
}
return UIImage(systemName: "circle") ?? UIImage()
}
我 运行 收到此错误消息以及系统转储。
2021-07-13 09:17:45.910734+0200 GameV[32820:1828401] The filter 'CIPortraitEffectSpillCorrection' is not implemented in the bundle at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/CoreImage/PortraitFilters.cifilter.
2021-07-13 09:17:45.911776+0200 GameV[32820:1828401] Metal GPU Frame Capture Enabled
2021-07-13 09:17:45.912087+0200 GameV[32820:1828401] Metal API Validation Enabled
2021-07-13 09:17:46.363938+0200 GameV[32820:1828401] -[__NSCFType imageByUnpremultiplyingAlpha]: unrecognized selector sent to instance 0x7f941bd15700
2021-07-13 09:17:46.377114+0200 GameV[32820:1828401] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType imageByUnpremultiplyingAlpha]: unrecognized selector sent to instance 0x7f941bd15700'
我是不是漏掉了 read/do 明显不对的地方?使用此代码调用它?
import Foundation
import SpriteKit
import CoreImage.CIFilterBuiltins
class GameScene: SKScene {
var img:UIImage!
let context = CIContext(options: nil)
static var shared = GameScene()
override func didMove(to view: SKView) {
backgroundColor = .white
let mono = generateMono(from: uiImage!) as? UIImage
let tex = SKTexture(image: mono!)
let box = SKSpriteNode(texture: tex, size: CGSize(width: 64, height: 64))
box.position = CGPoint(x: 128, y: 128)
addChild(box)
}
}
谢谢
我在 SwiftUI 项目上使用这个 UIImage 扩展,它工作正常:
import CoreImage
import CoreImage.CIFilterBuiltins
extension UIImage {
func applyFilter() -> UIImage {
let beginImage = CIImage(image: self )
let context = CIContext()
let customFilter = CIFilter.colorMonochrome()
customFilter.inputImage = beginImage
customFilter.intensity = 1
guard let outputImage = customFilter.outputImage else { return UIImage() }
// attempt to get a CGImage from our CIImage
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let filteredImage = UIImage(cgImage: cgimg)
return filteredImage
}
return UIImage()
}
}
用法:
struct ContentView: View {
var body: some View {
Image(uiImage: (UIImage(named: "img3")?.applyFilter())!)
}
}
它在评论中,但这里是关于如何设置对 CIColorMonochrome
的调用的完整(且格式更好)的答案:
let filter = CIFilter(name: "CIColorMonochrome")
let context = CIContext()
var extent: CGRect!
var scaleFactor: CGFloat!
@IBOutlet weak var img: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let ciImage = CIImage(image: img.image!)
// Note: you may use kCIInputImageKey for inputImage
filter?.setValue(ciImage, forKey: "inputImage")
filter?.setValue(Float(1), forKey: "inputAngle")
let result = filter?.outputImage
var image = UIImage(cgImage: context.createCGImage(result!, from: result!.extent)!)
img.image = image
}