Сбой при маскировке изображения - PullRequest
1 голос
/ 04 июня 2009

Я пытаюсь замаскировать изображение с помощью «маскирующего изображения». Сработало нормально с первого раза. Но когда я пробую еще раз внутри приложения с тем же изображением маски, приложение вылетает. При попытке с другим изображением маски он работает нормально. Почему это происходит?

Консольные шоу <Error>: CGImageMaskCreate: invalid mask bits/component: 4294967295.

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    CGImageRef maskRef = maskImage.CGImage;

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

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

    CGImageRelease(maskRef);
    CGImageRelease(mask);
    CGImageRelease(masked);

    return img2;
}

fun1()
{
view.image=[self maskImage:image1 withMask:[UIImage imageNamed:@"image2.png"]];
}

fun2()
{
view.image=[self maskImage:image1 withMask:[UIImage imageNamed:@"image2.png"]]; view.image=[self maskImage:image1 withMask:[UIImage imageNamed:@"image3.png"]];
}

fun3()
{
view.image=[self maskImage:image1 withMask:[UIImage imageNamed:@"image2.png"]];
view.image=[self maskImage:image1 withMask:[UIImage imageNamed:@"image2.png"]];
}

При звонках fun1 и fun2 приложение работает нормально. Сбой приложения при вызове fun3.

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Вот что вы пытаетесь сделать без утечек памяти или сбоев:

    - (UIImage*) maskImage:(UIImage *)image
              withMask:(UIImage *)maskImage
{
        CGImageRef imageRef = image.CGImage;
        CGImageRef maskRef = maskImage.CGImage;  
        CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                      CGImageGetHeight(maskRef),
                                      CGImageGetBitsPerComponent(maskRef),
                                      CGImageGetBitsPerPixel(maskRef),
                                      CGImageGetBytesPerRow(maskRef),
                                      CGImageGetDataProvider(maskRef),
                                      NULL, // decode should be NULL
                                      FALSE // shouldInterpolate
                                      );

        CGImageRef masked = CGImageCreateWithMask(imageRef, mask);
        CGImageRelease(mask);
        UIImage *maskedImage = [UIImage imageWithCGImage:masked];
        CGImageRelease(masked);
        return maskedImage;
}
1 голос
/ 23 мая 2010

Почему вы выпускаете maskRef? Вы не должны, потому что вы не сохранили его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...