2015-09-17 4 views
7

zu Xcode Aktualisiert vor 7 und immer diese (Warnung?) Nachricht, während ein Bild in einer Operation gemacht wurde:Erhalten der Nachricht in der Konsole: "CreateWrappedSurface() fehlgeschlagen für einen datenprovidergestützten CGImageRef."

CreateWrappedSurface() fehlgeschlagen für ein Dataprovider-backed CGImageRef.

Es gab keine Nachricht wie diese unter Xcode 6.4.

Got welcher Code Teil warf die Nachricht:

if (!self.originalImage) // @property (nonatomic, strong) UIImage *originalImage; 
     return; 

CGImageRef originalCGImage = self.originalImage.CGImage; 
NSAssert(originalCGImage, @"Cannot get CGImage from original image"); 
CIImage *inputCoreImage = [CIImage imageWithCGImage:originalCGImage]; // this results the console message 

ich meine CIIImage Schöpfer ersetzt es von der UIImage direkt zu erhalten:

CIImage *originalCIImage = self.originalImage.CIImage; 
NSAssert(originalCIImage, @"Cannot build CIImage from original image"); 

In diesem Fall habe ich keine Konsole bekommen haben Nachricht, hatte aber eine Behauptung: originalCIImage war null.

Die Klassenreferenz von UIImage sagt:

@property (nonatomic, nur lesbar) CIImage * CIImage

Wenn die UIImage-Objekt initialisiert wurde ein CGImageRef verwenden, der Wert der Eigenschaft null ist.

Ich verwende also den ursprünglichen Code als Ausweich:

CIImage *originalCIImage = self.originalImage.CIImage; 
if (!originalCIImage) { 
    CGImageRef originalCGImageRef = self.originalImage.CGImage; 
    NSAssert(originalCGImageRef, @"Unable to get CGimageRef of originalImage"); 
    originalCIImage = [CIImage imageWithCGImage:originalCGImageRef]; 
} 
NSAssert(originalCIImage, @"Cannot build CIImage from original image"); 

Das Problem ist, ich bin noch die Warnmeldungen bekommen in der Konsole.

Hat jemand diese Nachricht schon einmal bekommen? Was ist die Lösung, um diese warnende (?) Nachricht zu vernichten?

Danke, Adam

+0

Ich fing an, dieses (iOS9) zu bekommen, als ich anfing, meine CIFilters in den Hintergrundthreads zu laufen, weil sie so langsam sind (und auch in einem autoReleasePool). Es schien keine negativen Auswirkungen zu haben, nur diese Nachricht selbst, aber ich forsche immer noch nach Antworten. –

+0

Ich scheine es nur am Simulator zu bekommen, nicht am Gerät. Hmmm –

+0

Konvertieren Sie einfach Ihr Bild von RGB nach RGBA –

Antwort

8

Schließlich die Antwort herausgefunden. Neugierig durch die Fehler studierte ich auf, wie CIImage arbeitet (https://uncorkedstudios.com/blog/image-filters-with-core-graphics)

Ich bemerkte, dass die CGImageRef Dataprovider-backed mit premultiplied Werten (RGB und A)

dachte ich mir, dass die CGImage Ich bin Laden in ein CIImage (mit [CIImage imageWithCGImage:originalCGImage]; ist nur RGB und nicht RGBA). Sicher genug, ich habe dieses Bild erstellt, indem ich einen Schnappschuss einer Ansicht unter Verwendung des Standards UIGraphicsBeginImageContextWithOptions gemacht habe, und ich hatte den undurchsichtigen Parameter auf "JA" eingestellt.

es einfach geändert:

UIGraphicsBeginImageContextWithOptions(bounds, YES, 1.0f);

zu

UIGraphicsBeginImageContextWithOptions(bounds, NO, 1.0f);

So dass ich jetzt ein RGBA Bild, nicht ein RGB-Bild erschaffe.

Jetzt konvertiere ich meine CGImage zu CIImage und die CImage JETZT hat die richtige Datenprovider Rückendeckung und der Fehler verschwindet.


HINWEIS:

Ich war mit einem CIClamp Filter für Gaußsche Unschärfe Zwecke und mit undurchsichtigem Satz auf NO die Klammer nicht so effektiv funktioniert. Ich entschied mich, den Opak bei JA zu belassen und die Logwarnungen zu ignorieren, sie scheinen nichts zu tun.)

+0

Danke für den Hinweis! Ist das die einzige Möglichkeit, diese Warnung/Fehlermeldung zu vermeiden? Ich meine, ich benutze CIContext und CIFilter (s) zur Manipulation und bringt CGContext in diese Methode, fühlt sich ein bisschen wie ein Overhead an. –

+0

@AdamSzabo Sie können immer noch alles tun, stellen Sie nur sicher, dass Ihr CGContext nicht undurchsichtig ist, aber einen Alpha-Kanal hat. –