2010-09-28 1 views
1

Я ищу для Quartz 2D эксперта, который мог бы быть в состоянии видеть ошибку в следующем коде:Quartz 2D Эксперты - метод маскирования врезается программы после того, как 6 или 7 последовательных вызовов

self.imageView.image = [self maskView:self.imageView withMask:[self createMaskForTool:self.toolView modifyForOutline:NO]]; 

- (UIImage *)maskView:(UIView *)view withMask:(UIImage *)maskImage 
{ 
    UIGraphicsBeginImageContext(view.bounds.size); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    CGImageRef maskRef = maskImage.CGImage; 
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef masked = CGImageCreateWithMask([viewImage CGImage], mask); 
    UIImage *resultingImage = [UIImage imageWithCGImage:masked]; 

    CGImageRelease(mask); 
    CGImageRelease(masked); 

    return resultingImage; 
} 

- (UIImage *)createMaskForTool:(Tool *)tool modifyForOutline:(BOOL)forOutline 
{ 
    UIGraphicsBeginImageContext(self.imageView.frame.size); 

    // Draw black mask background 
    [[UIImage imageNamed:@"mask.png"] drawInRect:CGRectMake(0, 0, self.imageView.frame.size.width, self.imageView.frame.size.height)]; 

    // Draw white mask shape 
    CGSize aspectRatioCorrectToolSize = [self aspectRatioCorrectSizeForImage:tool.maskImage toFitInSize:tool.frame.size]; 

    [self.toolView.maskImage drawInRect:CGRectMake((tool.frame.origin.x+(tool.frame.size.width-aspectRatioCorrectToolSize.width)/2)-self.imageView.frame.origin.x+(forOutline ? OUTLINE_THICKNESS : 0), 
               (tool.frame.origin.y+(tool.frame.size.height-aspectRatioCorrectToolSize.height)/2)-self.imageView.frame.origin.y+(forOutline ? OUTLINE_THICKNESS : 0), 
               aspectRatioCorrectToolSize.width-(forOutline ? OUTLINE_THICKNESS : 0)*2, 
               aspectRatioCorrectToolSize.height-(forOutline ? OUTLINE_THICKNESS : 0)*2)]; 

    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return resultingImage; 
} 

Эти методы постепенно замаскируйте изображение. Приложение начинается с полного изображения, и пользователь может использовать инструменты для «измельчения отверстий» через изображение. Чтобы создать эффект дыры, я сначала создаю маску с помощью createMaskForTool: modifyForOutline: затем используйте полученную маску в maskView: withMask: применить маску к изображению. Новое замаскированное изображение затем заменяет существующий imageView.image, и новое изображение используется в качестве базового изображения в следующий раз, когда будет вырезано новое отверстие. Мы пробивали код, чтобы найти другие утечки, которые могут вызвать предупреждения о памяти, которые мы получаем, но неизменно после того, как вы назовете эти маскирующие функции 6 или 7 раз подряд, приложение выйдет из строя.

ответ

0

Это кажется большим количеством дополнительной работы. Почему бы не просто установить layermask?

(я знаю, это не конкретно ответить на ваш вопрос, но я думаю, что это может быть полезно смотреть в)

+0

Это может конкретно ответить на мой вопрос;) Я на самом деле просто ищу лучший способ замаскировать изображение ... Я попробую установить свойство маски слоя и посмотреть, что произойдет. Благодаря! – RyJ

 Смежные вопросы

  • Нет связанных вопросов^_^