Ich möchte einen CIImage in einen Pixelpuffer vom Typ kCVPixelFormatType_128RGBAFloat rendern. Aber CIContext.render() schlägt fehl, "nicht unterstütztes Format" zu sagen. Getestet habe ich auf dem iPhone 7 plus mit iOS 11.Wie rendere ich einen CImage in einen Fließkomma-Pixelpuffer mit 32 Bit pro Kanal?
Hier ist mein Code:
let context = CIContext()
var buffer: CVPixelBuffer? = nil
let buffer = CVPixelBufferCreate(nil,
width,
height,
kCVPixelFormatType_128RGBAFloat,
nil,
&buffer)
assert(buffer != nil, "Couldn't create buffer")
context.render(ciImage, to: buffer)
Der Puffer erfolgreich erstellt wurde - die Behauptung nicht ausgelöst. Es ist nur das Rendering in der letzten Zeile, das nicht "nicht unterstütztes Format" sagt.
Ich habe auch versucht, eine IOSurface-backed CVPixelBuffer durch Ersetzen der zweiten Null mit [kCVPixelBufferIOSurfacePropertiesKey: [:]] as CFDictionary
, aber es hat nicht geholfen.
Wie bekomme ich das zur Arbeit?
Das Format muss kCVPixelFormatType_128RGBAFloat sein, aus Gründen, die zu komplex sind, um hier hineinzukommen, die kurze Version besteht darin, dass die Pixelwerte einen größeren Bereich als 0-255 haben, einschließlich Bruchzahlen, die nicht gerundet werden können.
Ich habe versucht, ein paar mehr Dinge:
- kCVPixelFormatType_64ARGB
- Die software renderer
- die CIContext durch einen durch einen Aufruf CIContext MTLDevice
- gesichert EAGLContext
- gesichert Erstellen der CIContext erstellen. createCGImage()
- Rendering zu einem MTLTexture, aber ich konnte nicht herausfinden, wie man einen erstellt.
- Rendering auf eine IOSurface
- Aufruf clearCaches() auf CIContext().
- Aufruf reclaimResources(), aber das ist nicht für iOS verfügbar.
- Überprüfen, ob meine Eingabe < CIContext ist. inputImageMaximumSize() und outputImageMaximumSize()
- Rendern auf eine raw Byte-Array.
Keine von diesen funktioniert. Wird das Rendern auf 32-Bit pro Kanal Float oder 16 Bit pro Kanal Ints nicht von Core Image unterstützt?