CGImageCreateWithMaskingColors返回null

时间:2014-02-17 05:14:19

标签: ios objective-c masking cgimage ciimage

我有一个黑色文字的视图,我想在其周围创建一个白色的“发光”。我想我可以通过抓取屏幕截图,反转颜色(它只是黑色和白色),将黑色屏蔽为透明,然后在每个方向上“抖动”生成的图像来实现此目的。当我尝试用CGImageCreateWithMaskingColors掩盖黑色时,我得到一个空的CGImageRef。到目前为止,这就是我所拥有的。

//First get a screenshot into a CI image so I can apply a CI Filter
UIGraphicsBeginImageContext(self.view.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
CIImage* ciImage = [[CIImage alloc] initWithCGImage:[UIGraphicsGetImageFromCurrentImageContext() CGImage]];
UIGraphicsEndImageContext();

//Now apply the CIColorInvert filter
CIFilter* filter = [CIFilter filterWithName:@"CIColorInvert" keysAndValues:kCIInputImageKey, ciImage, nil];
ciImage = [filter valueForKey:kCIOutputImageKey];

//Now I need to get a CG image from the CI image.
CIContext* ciContext = [CIContext contextWithOptions:nil];
CGImageRef ref = [ciContext createCGImage:ciImage fromRect:[ciImage extent]];

//Now I try to mask black
const float maskingColor[6] = {0,0,0,0,0,0};
ref = CGImageCreateWithMaskingColors(ref, maskingColor); //ref is (null)

我知道alpha通道可以破坏作品,但我真的不认为我有任何alpha通道。只是为了检查我做了CGImageGetColorSpace(ref)并得到kCGColorSpaceDeviceRGB,没有alpha频道。

有人可以告诉我哪里出错了吗?或者,快速评论帮助我理解UIImage,CIImage和CGImage之间的差异会很棒。

2 个答案:

答案 0 :(得分:1)

查看CGImageCreateWithMaskingColors的文档将image参数描述为:

  

要掩盖的图像。该参数可能不是图像掩码   还没有与之相关的图像蒙版或蒙版颜色,   和不能有alpha组件

您应该使用CGImageGetAlphaInfo来确定您的CGImageRef是否具有Alpha通道。

在摆脱那个讨厌的alpha通道方面,我认为你会发现这个问题很有帮助:

CGBitmapContextCreate with kCGImageAlphaNone

答案 1 :(得分:0)

这是我的解决方案,可能有更好的方法可以做到这一点,但这有效!

- (UIImage *)imageWithChromaKeyMasking {
    const CGFloat colorMasking[6]={255.0,255.0,255.0,255.0,255.0,255.0};
    CGImageRef oldImage = self.CGImage;
    CGBitmapInfo oldInfo = CGImageGetBitmapInfo(oldImage);
    CGBitmapInfo newInfo = (oldInfo & (UINT32_MAX ^ kCGBitmapAlphaInfoMask)) | kCGImageAlphaNoneSkipLast;
    CGDataProviderRef provider = CGImageGetDataProvider(oldImage);
    CGImageRef newImage = CGImageCreate(self.size.width, self.size.height, CGImageGetBitsPerComponent(oldImage), CGImageGetBitsPerPixel(oldImage), CGImageGetBytesPerRow(oldImage), CGImageGetColorSpace(oldImage), newInfo, provider, NULL, false, kCGRenderingIntentDefault);
    CGDataProviderRelease(provider); provider = NULL;
    CGImageRef im = CGImageCreateWithMaskingColors(newImage, colorMasking);
    UIImage *ret = [UIImage imageWithCGImage:im];
    CGImageRelease(im);
    return ret;
}