CGLayerRef оказывается пустым только в OS X 10.11 (El Capitan)

У меня есть приложение для редактирования изображений, которое работало до версии 10.10, но в версии 10.11 возникла ошибка.

Когда я просматриваю CIImage, созданный с -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 это пустое изображение того же размера. Я попытался просмотреть различия API для CGLayer и CIImage, но документация слишком сложна для меня. Кто-нибудь еще сталкивался с этой проблемой? Я предполагаю, что это должно быть что-то с инициализацией CGContextRef, потому что все остальное в коде связано с размером


person A O    schedule 17.07.2015    source источник
comment
Спроси это на форумах разработчиков Apple, глупый.   -  person El Tomato    schedule 18.07.2015
comment
Я никогда не делал этого раньше D: но ты прав, ха-ха, просто привык спрашивать ТАК. отчитаюсь   -  person A O    schedule 18.07.2015


Ответы (1)


Этот конкретный 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)

person Jeff Szuhay    schedule 17.03.2017