2015-07-17 3 views
0

J'ai une application de retouche d'image, qui travaille à 10.10, mais en 10.11 un bug est venuCGLayerRef se révèle vide uniquement dans OS X 10.11 (El Capitan)

Quand je regarde un CIImage créé w/-imageWithCGLayer , il montre comme une image vide (de la taille correcte) que dans 10,11

CGSize size = NSSizeToCGSize(rect.size); 
    size_t width = size.width; 
    size_t height = size.height; 
    size_t bitsPerComponent = 8; 
    size_t bytesPerRow = (width * 4+ 0x0000000F) & ~0x0000000F; // 16 byte aligned is good 
    size_t dataSize = bytesPerRow * height; 
    void* data = calloc(1, dataSize); 

    CGColorSpaceRef colorspace = [[[_imageController document] captureColorSpace] CGColorSpace]; 
    CGContextRef bitmapContext = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaNone | kCGBitmapByteOrder32Host); 

    CGLayerRef canvasLayer = CGLayerCreateWithContext(bitmapContext, scaledRect.size, NULL); 

    [self drawCanvasInLayer:canvasLayer inRect:scaledRect]; 
    CIImage *test = [CIImage imageWithCGLayer:canvasLayer]; 
    NSLog(@"%@",test); 

Alors, quand je vois CIImage *test sur 10.10, il semble précisément que je le veux. Le 10.11, il s'agit d'une image vide de la même taille. J'ai essayé de regarder les différences API pour CGLayer & CIImage mais la documentation est trop dense pour moi. Est-ce que quelqu'un d'autre a trébuché sur ce problème? J'imagine que cela doit être quelque chose avec l'initialisation du CGContextRef, parce que tout le reste dans le code est lié à la taille

+0

Informez-vous sur les forums des développeurs Apple, idiot. –

+0

Je ne l'ai jamais fait avant D: mais vous avez raison de juste demander à SO. fera rapport –

Répondre

1

Cette API particulière était obsolète depuis longtemps et complètement supprimée dans macOS 10.11. Donc, vos résultats sont attendus.

Puisque vous avez déjà un bitmapContext, modifier votre méthode -drawCanvasInLayer: pour dessiner directement dans le bitmap, puis créer l'image en utilisant le contexte de bitmpap thusly,

CGImageRef tmpCGImage = CGBitmapContextCreateImage(bitmapContext); 
CIImage* myCIImage = [[CIImage alloc] initWithCGImage: myCIImage]; 

Rappelez-vous de faire CGImageRelease(tmpCGImage)après que vous avez terminé votre CIImage.

J'ai récemment résolu ce problème et posté un exemple de projet d'objectif C pour contourner la perte de cette API.

Voir http://www.blinddogsoftware.com/goodies/#DontSpillTheBits

En outre, ne pas oublier de lire le fichier d'en-tête où cette API est déclarée. Il y a très souvent des informations très utiles là-bas (dans Xcode, Commande + clic sur l'API spécifique)