2016-04-14 8 views
0

In meiner App mache ich viele Bildtransformationen in einem Kontext, in dem sie so schnell wie möglich sein müssen. Es gibt 3 Schritte:So extrahieren Sie planares Bild von CoreImage?

1 - Daten in einen CII einspeisen 2- Dieses Bild mit den Filtern transformieren 3- Die verarbeiteten Pixeldaten im erwarteten Format extrahieren.

Mein Problem ist, Schritt 3. Ich nur die Ausgabe CIImage in 8-Bit RGBA machen könnte, mit diesem Aufruf:

CIImage *outputImage = gExitFilter.outputImage; 
CGImageRef finalImage = [gCoreImageContext createCGImage:outputImage fromRect:outputImage.extent]; 
CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(finalImage)); 

Nun ist es so, dass in einigen Fällen wir die Ausgabe in planaren grau-Format benötigen (Sowohl 8-Bit-Ganzzahl als auch 32-Bit-Gleitkommazahl sind erforderlich).

Natürlich kann ich in den meisten Fällen die Daten aus dem obigen Code wieder in das erwartete Format (z. B. mit vImage) umwandeln. Aber das ist verschwenderisch für mich. Gibt es keine Möglichkeit, den CImage direkt in ein bestimmtes Pixelformat zu rendern?

Und es gibt Fälle, in denen ein solcher Konvertierungsschritt nicht verlustfrei möglich ist: Wenn das gewünschte Ausgabeformat ein planarer 32-Bit Float ist, wird die Konvertierung von 8-Bit RGBA recht grob sein.

ich würde erwarten, dass eine Lösung sein, da Schritt 1 für das erlaubt, Code wie der folgenden:

CIImage *inputImage = [CIImage imageWithBitmapData:self.backingData bytesPerRow:bytesPerRow size:fullSize format:kCIFormatR8 colorSpace:gDeviceGrayColorSpace]; 

kCIFormatR8 hier läßt mich Eingang ein wenig planaren 8 Bild in den roten Kanal der CIImage, von wo es mit einem Filter einfach ist, es in die anderen Kanäle zu kopieren.

Mit all diesem Zusammenhang kocht meine Frage nach unten:

Gibt es eine Möglichkeit, eine CIImage in ein Einkanal-ebenen Bild zu machen?

(meine App ist ein MacOS X app, aber eine Antwort für iOS könnte auch interessant sein, und mich vielleicht in die richtige Richtung weisen)

Edit:

- (CGImageRef)createCGImage:(CIImage *)im fromRect:(CGRect)r format:(CIFormat)f colorSpace:(CGColorSpaceRef)cs 

: Ich habe dieses Verfahren gefunden Was aussieht, als wäre es genau das, was ich brauchte. Ich konnte es jedoch nicht effektiv nutzen. Jeder Vorschlag willkommen.

Antwort

0

Um nur ein Kanal eines CIImage machen Sie sollten:

  • die in den gewünschten Kanalfilter Splat CIColorMatrix Verwenden zu R, G und B.
  • Verwenden [CIContext Render: toBitmap: Format: kCIFormatR8 ]