2

私はアルファチャンネル付きの300x400ピクセルのPNG-24を持っています。約140kbです。その一部をマスクしたいので、別の300 x 400の画像をPNG-24として作成しましたが、黒、灰色、白のみで、アルファチャネルはありません。

奇妙なことに、マスクが黒の場合、画像は元の状態に保たれます。透明性はありません。しかし、マスクが白の場合、画像は黒だけになります。透明性はありません。

50x50ピクセルのような非常に小さな画像で部分的に機能します。この関数の何が問題になっているのでしょうか。

+ (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 theImage = image.CGImage;
    CGImageRef masked = CGImageCreateWithMask(theImage, mask);
    return [UIImage imageWithCGImage:masked];
}

私の背景はオレンジ色なので、この色が透けて見えるはずです。画像を保持するUIImageViewは、clearColor/transparencyおよびopaque=NOに設定されます。

4

2 に答える 2

0

あなたのコードはここからだと思います。このコメントがあります:

アルファチャネルを持たない画像を正しくマスクできるようにコードを改善しました。

したがって、うまくいかない場合は、画像にアルファチャネルがない可能性があります。

于 2009-07-16T08:53:09.120 に答える
0

注意してください-そのコードはリークします!このメソッドをループで実行するまで気づきませんでした。画像を返す前に、必ず電話してくださいCGImageRelease(mask)CGImageRelease(masked)

- (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 *img = [UIImage imageWithCGImage:masked];

    //otherwise we will leak
    CGImageRelease(mask);
    CGImageRelease(masked);

    return img;
}
于 2013-09-09T14:29:55.327 に答える