Скопируйте CGContext в другой CGContext - PullRequest
9 голосов
/ 05 августа 2011

Я выполняю некоторые операции рисования 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.

Ответы [ 2 ]

1 голос
/ 25 мая 2016

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

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

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

0 голосов
/ 29 января 2019

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

...