CGLayerRef仅在OS X 10.11(El Capitan)

时间:2015-07-17 21:03:32

标签: objective-c cocoa cgcontext ciimage osx-elcapitan

我有一个图像编辑应用程序,一直在使用10.10,但在10.11中出现了一个错误

当我查看CIImage创建的w / -imageWithCGLayer时,它仅在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);

因此,当我在10.10上查看CIImage *test时,它看起来就像我想要的那样。在10.11,它是相同大小的空白图像。 我试着看看CGLayer&的API差异。 CIImage但文档对我来说太密集了。还有其他人偶然发现了这个问题吗?我想它必须是CGContextRef的初始化,因为代码中的其他内容都与大小相关

1 个答案:

答案 0 :(得分:1)

该特定API在不久前被弃用,并在macOS 10.11中完全删除。所以你的结果是预期的。

由于你已经有了一个bitmapContext,修改你的-drawCanvasInLayer:方法直接绘制到位图,然后使用bitmpap上下文创建图像,

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

在完成CIImage之后,请记得<{1}}

我最近解决了这个问题,并发布了一个示例Objective-C项目,以解决此API的丢失问题。

请参阅http://www.blinddogsoftware.com/goodies/#DontSpillTheBits

另外,不要忘记阅读声明API的头文件。那里经常有非常有用的信息(在Xcode中,Command +点击特定的API)