0

我有一个图像编辑应用程序,它一直工作到 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);

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

4

1 回答 1

1

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

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

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

记得在你完成 CIImageCGImageRelease( tmpCGImage ) 之后再做。

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

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

另外,不要忘记阅读声明该 API 的头文件。那里经常有非常有用的信息(在 Xcode 中,Command+click on the specific API)

于 2017-03-17T02:56:55.593 回答