2014-02-17 26 views
0

我有一個視圖,周圍有黑色文字,我想創建一個白色的「發光」。我想我可以通過抓取屏幕截圖,倒置顏色(它只是黑白),遮住黑色透明,然後在每個方向上抖動結果圖像來做到這一點。當我嘗試用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之間的差異會很大。

回答

1

看爲CGImageCreateWithMaskingColors的文檔描述了image參數爲:

圖像掩蓋。此參數可能不是圖像蒙版,可能 尚不具有與其關聯的圖像蒙版或蒙版顏色, 和不能具有阿爾法分量

您應該使用CGImageGetAlphaInfo來確定您的CGImageRef是否具有Alpha通道。

而且在擺脫討厭的alpha通道方面,我想你會發現這太問題有所幫助:

CGBitmapContextCreate with kCGImageAlphaNone

+0

謝謝,'CGImageGetAlphaInfo(ref)'返回'1'。 然後我嘗試'const CGFloat maskingColor [8] = {0,0,0,0,0,0,0,0};'但我仍然得到(null)。 – user2320861

+0

這是'kCGImageAlphaPremultipliedLast',這意味着你有一個alpha通道。 –

+1

查看我上面的編輯。這個alpha通道肯定會給你帶來一些問題。 –

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; 
} 
+0

它不工作我試圖將灰色像素更改爲藍色像素如何使用您的代碼實現 –