2009-07-16 4 views
2

私はアルファチャンネル付き300 x 400 px PNG-24を持っています。それは約140kbです。私はその一部を覆い隠したいので、PNG-24として別の300 x 400の画像を作成しましたが、黒、灰色、白だけでアルファチャンネルはありませんでした。イメージマスクがイメージを黒くしてしまうのはなぜですか?マスクは白​​です。

奇妙なことです:マスクが黒色の場合、画像は元のままです。透明性がありません。しかし、マスクが白の場合、画像は黒く黒くなります。透明性がありません。

50 x 50ピクセルなどの非常に小さな画像では部分的に機能します。この機能に何が間違っているのでしょうか?

+ (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に設定されます。

答えて

0

あなたのコードはfrom hereだと思います。それは 正しく アルファチャンネルを持っていない画像をマスクすることができるように、私は、コードを改善しました

:このコメントがあります。

これでうまくいかない場合は、画像にアルファチャンネルが含まれていない可能性があります。

+0

ありがとうございます!保存するときに透明であるかどうかをチェックしても、透明なピクセルがないと、私の愚かなグラフィックスアプリケーションがアルファチャンネルを作成しないことがわかりました。それが問題でした! – Thanks

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; 
} 
関連する問題