CGImageCreateWithMaskingColors返回null

我有一个视图,周围有黑色文字,我想创建一个白色的“发光”。我想我可以通过抓取屏幕截图,倒置颜色(它只是黑白),遮住黑色透明,然后在每个方向上抖动结果图像来做到这一点。当我尝试用CGImageCreateWithMaskingColors遮罩黑色时,我得到一个空的CGImageRef。到目前为止,这是我的。CGImageCreateWithMaskingColors返回null

//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通道在这里。只是为了检查我是否CGImageGetColorSpace(ref)并得到了kCGColorSpaceDeviceRGB,没有alpha通道。

有人可以告诉我我要去哪里吗?可选地,快速评论帮助我理解UIImage,CIImage和CGImage之间的差异会很大。

回答:

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

图像掩盖。此参数可能不是图像蒙版,可能 尚不具有与其关联的图像蒙版或蒙版颜色, 和不能具有阿尔法分量。

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

而且在摆脱讨厌的alpha通道方面,我想你会发现这太问题有所帮助:

CGBitmapContextCreate with kCGImageAlphaNone

回答:

这里是我的解决方案,可能有这样做的更好的办法,但这工作!

- (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;

}

以上是 CGImageCreateWithMaskingColors返回null 的全部内容, 来源链接: utcz.com/qa/258479.html

回到顶部