Скопируйте CGContext в другой CGContext

objective-c swift core-graphics cgcontext

2466 просмотра

2 ответа

Я выполняю некоторые операции рисования CG в CGContext, который я создал для MKMapOverlayView. После рисования в моем контексте я создаю изображение и вставляю его в контекст, предоставленный MapKit.

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
    CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceRGB();
    CGContextRef myContext = CGBitmapContextCreate(NULL, kTileSize, kTileSize, 8, 0, colorRef, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorRef);
    CGContextSetAllowsAntialiasing(myContext, TRUE);
    //...cut out drawing operations...
    CGImageRef image = CGBitmapContextCreateImage(myContext);
    CGContextDrawImage(context, [self rectForMapRect:mapRect], image);
    CGImageRelease(image);
    CGContextRelease(myContext);
}

Есть ли способ просто скопировать myContextв contextбез создания изображения?

Я понимаю, что некоторые из вас скажут: «Почему бы просто не рисовать непосредственно в контексте, который предоставляет MapKit». К сожалению, при рендеринге мы видим сбой при рисовании context. Apple в настоящее время изучает эту проблему для нас, но в то же время мы должны найти обходной путь. Этот обходной путь, который я представил выше, является моим «лучшим» выстрелом, но он немного медленный.

PS Я начал щедрость, так как я тоже ищу ответ здесь. Конкретно я ориентируюсь на OS X. Так что ответ должен работать там. ОП искал ответ на iOS.

Автор: Tim Reddy Источник Размещён: 17.05.2019 03:18

Ответы (2)


1 плюс

Вы можете использовать CGLayerRef. Ссылка на слой похожа на субконтекст, в который вы выполняете кучу рисования, а затем выравниваете его до исходного контекста, когда заканчиваете рисовать ценность содержимого слоя.

Обычно он используется для получения общих альфа-каналов или теней по многим вызовам рисования, а не по каждому отдельному вызову.

Я не знаю, будет ли это все еще обходить любую ошибку, с которой вы сталкиваетесь, или производительность будет лучше или хуже, чем двухконтекстный подход. Мне нужно больше узнать о ваших целях и потребностях. Например, хотите ли вы избежать использования двух контекстов, чтобы избежать второй копии, или потому что вы не хотите платить за память за второе изображение?

Автор: Jon Hess Размещён: 25.05.2016 06:58

0 плюса

Фактическая физическая копия битов происходит только в том случае, если базовые данные в контексте растрового изображения изменяются при использовании CGBitmapContextCreateImage, поэтому при создании изображения из CGBitmapContext не происходит значительных потерь производительности.

Автор: W.Terry Размещён: 29.01.2019 03:05
Вопросы из категории :
32x32