2015-09-17 3 views
7

Mise à jour Xcode 7 et obtenir ce (avertissement?) Un message alors qu'une image était rendue dans une opération:Obtention de message dans la console: "CreateWrappedSurface() a échoué pour un CGImageRef soutenu par le fournisseur de données."

CreateWrappedSurface() a échoué pour une CGImageRef de dataprovider soutenu.

Il n'y avait aucun message comme ceci sous Xcode 6.4.

Got quelle partie du code a jeté le message:

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 

J'ai remplacé mon créateur de CIIImage pour obtenir directement à partir du UIImage:

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

Dans ce cas, je n'ai pas eu console message, mais avait une assertion: originalCIImage était nul.

La référence de classe de UIImage dit:

@property (nonatomic, en lecture seule) CIImage * CIImage

Si l'objet UIImage a été initialisé à l'aide d'un CGImageRef, la valeur de la propriété est nulle.

Je suis en utilisant le code d'origine comme fallback:

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"); 

Le problème est, je suis encore en train les messages d'avertissement dans la console.

Est-ce que quelqu'un a déjà reçu ce message? Quelle est la solution pour nuke ce message d'avertissement (?)?

Merci, Adam

+0

J'ai commencé à l'obtenir (iOS9) quand j'ai commencé à utiliser mes CIFilters dans les threads de fond parce qu'ils sont si lents (et aussi dans un autoReleasePool). Cela n'a pas semblé causer d'effets négatifs, juste ce message en lui-même, mais je cherche encore des réponses. –

+0

J'ai l'impression de ne l'avoir que sur simulateur, pas sur l'appareil. Hmmm –

+0

Il suffit de convertir votre image de RGB à RGBA –

Répondre

8

finalement trouvé la réponse. Curieux par l'erreur j'ai étudié sur la façon dont CIImage fonctionne (https://uncorkedstudios.com/blog/image-filters-with-core-graphics)

J'ai remarqué que le CGImageRef est dataprovider soutenu par des valeurs prémultipliées (RVB et A)

Je me suis dit que le CGImage je suis chargement dans un CIImage (en utilisant [CIImage imageWithCGImage:originalCGImage]; est seulement RVB et pas RGBA). Effectivement, je créais cette image en prenant un instantané d'une vue en utilisant le standard UIGraphicsBeginImageContextWithOptions et j'avais le paramètre opaque réglé sur "OUI".

J'ai simplement changé:

UIGraphicsBeginImageContextWithOptions(bounds, YES, 1.0f);

à

UIGraphicsBeginImageContextWithOptions(bounds, NO, 1.0f);

Alors que je suis en train de créer une image RGBA, pas une image RVB.

Maintenant, je convertis mon CGImage en CIImage et le CIImage MAINTENANT a le bon support de fournisseur de données et l'erreur disparaît.


NOTE:

Je travaillais avec un filtre CIClamp à des fins de flou gaussien, et ensemble opaque NO la pince ne fonctionne pas aussi efficacement. J'ai décidé de garder l'opaque à YES et d'ignorer les avertissements du journal, ils ne semblent rien faire.)

+0

Merci pour le conseil! Est-ce la seule façon d'éviter ce message d'avertissement/d'erreur? Je veux dire que j'utilise CIContext et CIFilter (s) pour la manipulation et que CGContext dans cette méthode ressemble un peu à un overhead. –

+0

@AdamSzabo vous pouvez toujours faire tout cela, assurez-vous simplement que votre CGContext n'est pas opaque mais possède un canal alpha. –