0

初めて呼び出されたときに正常に動作する CGImageMaskCreate を使用して、マスクされた画像を作成しています。ただし、同じ関数が drawRect から 2 回呼び出されると、作成されたマスクされたイメージは空になります。

- (void)drawRect:(CGRect)rect{    
UIImage *maskImage = [UIImage imageNamed:@"circle.png"]; //This will be replaced    
UIImage *maskedImage = [self maskImage:_selectedImage withMask:maskImage];    
_selectedImage = maskedImage;    
[_selectedImage drawInRect:rect];                      
}

- (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 *result = [UIImage imageWithCGImage:masked];
    NSLog(@"    MASK >> RETURNING %@ %f %f", 
           result.description, result.size.width, result.size.height);
return result;
}

draw rect が 3 回実行された後、ログの出力は次のようになります。

MASK >> RETURNING UIImage: 0x903d720 320.000000 480.000000
MASK >> RETURNING UIImage: 0x73660c0 0.000000 0.000000
MASK >> RETURNING UIImage: 0x90f7390 0.000000 0.000000

そのため、2回目に呼び出された後、マスクされた画像は空になっているようです。

助けていただければ幸いです。これは iOS 用の私の最初のアプリなので、おそらく明らかなことです。

4

1 に答える 1

0

それはあなたのプログラムロジックだと思います:

最初_selectedImageは空です。したがって、マスクは円を作成します。

_selectedImageこれで、すでに円が含まれています。したがって、2 回目はマスクによって円がゼロになります。

--> 予想される動作。予想していなかった場合は、Core Graphics のマスキング関数を読みたいと思うかもしれません。

于 2012-12-16T17:14:53.543 に答える