2014-02-17 2 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) 

Я знаю, что альфа-каналы могут заглушить работы, но я действительно не думаю, что у меня есть какие-то альфа-каналы здесь. Просто чтобы проверить, что я сделал CGImageGetColorSpace(ref) и получил kCGColorSpaceDeviceRGB, нет альфа-канала.

Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь? Необязательно, быстрый комментарий, помогающий мне понять различия между UIImage, CIImage и CGImage, будет отличным.

ответ

1

Глядя на документацию для CGImageCreateWithMaskingColors описывает image параметр, как:

Изображение маскировать. Этот параметр может не быть маской изображения, возможно, у уже нет маски изображения или маскирующего цвета, связанные с ней, и не могут иметь альфа-компонент.

Чтобы определить, имеет ли ваш CGImageRef альфа-канал, вы должны использовать CGImageGetAlphaInfo.

И с точкой зрения избавления от этого противного альфа-канала, я думаю, вы найдете это так вопрос полезный:

CGBitmapContextCreate with kCGImageAlphaNone

+0

Спасибо, 'CGImageGetAlphaInfo (ref)' received '1'. Затем я попробовал 'const CGFloat maskingColor [8] = {0,0,0,0,0,0,0,0};', но я все еще получаю (null). – user2320861

+0

Что такое 'kCGImageAlphaPremultipliedLast', что означает, что у вас есть альфа-канал. –

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

Это не работает Я пытаюсь изменить серый пиксель на синий пиксель, как я могу достичь с помощью вашего кода –

Смежные вопросы