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