Quartz 2D Experts - метод маскирования завершает работу программы после 6 или 7 последовательных вызовов - PullRequest
1 голос
/ 29 сентября 2010

Я ищу эксперта Quartz 2D, который мог бы увидеть дефект в следующем коде:

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 раз подряд, приложение вылетает.

1 Ответ

0 голосов
/ 29 сентября 2010

Это похоже на большую дополнительную работу. Почему бы просто не установить свойство layer mask?

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

...