CGLayerRef 仅在 OS X 10.11 (El Capitan) 中为空
CGLayerRef turns out empty only in OS X 10.11 (El Capitan)
我有一个图像编辑应用程序,它一直运行到 10.10,但在 10.11 中出现了一个错误
当我查看使用 -imageWithCGLayer
创建的 CIImage
时,它仅在 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 和 CIImage 的 API 差异,但文档对我来说太密集了。还有其他人偶然发现了这个问题吗?我想它一定是带有 CGContextRef
初始化的东西,因为代码中的其他所有内容都与大小相关
那个特定的 API 已在一段时间前弃用,并在 macOS 10.11 中完全删除。所以你的结果是意料之中的。
因为你已经有一个 bitmapContext,修改你的 -drawCanvasInLayer:
方法直接绘制到位图中,然后使用 bitmpap 上下文创建图像,
CGImageRef tmpCGImage = CGBitmapContextCreateImage( bitmapContext );
CIImage* myCIImage = [[CIImage alloc] initWithCGImage: myCIImage];
记住 CGImageRelease( tmpCGImage )
在 完成 CIImage 之后。
我最近解决了这个问题并发布了一个示例 objective-C 项目来解决这个 API 的损失。
见http://www.blinddogsoftware.com/goodies/#DontSpillTheBits
此外,不要忘记阅读声明 API 的头文件。那里通常有非常有用的信息(在 Xcode 中,Command+单击特定的 API)
我有一个图像编辑应用程序,它一直运行到 10.10,但在 10.11 中出现了一个错误
当我查看使用 -imageWithCGLayer
创建的 CIImage
时,它仅在 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 和 CIImage 的 API 差异,但文档对我来说太密集了。还有其他人偶然发现了这个问题吗?我想它一定是带有 CGContextRef
初始化的东西,因为代码中的其他所有内容都与大小相关
那个特定的 API 已在一段时间前弃用,并在 macOS 10.11 中完全删除。所以你的结果是意料之中的。
因为你已经有一个 bitmapContext,修改你的 -drawCanvasInLayer:
方法直接绘制到位图中,然后使用 bitmpap 上下文创建图像,
CGImageRef tmpCGImage = CGBitmapContextCreateImage( bitmapContext );
CIImage* myCIImage = [[CIImage alloc] initWithCGImage: myCIImage];
记住 CGImageRelease( tmpCGImage )
在 完成 CIImage 之后。
我最近解决了这个问题并发布了一个示例 objective-C 项目来解决这个 API 的损失。
见http://www.blinddogsoftware.com/goodies/#DontSpillTheBits
此外,不要忘记阅读声明 API 的头文件。那里通常有非常有用的信息(在 Xcode 中,Command+单击特定的 API)