2010-08-25 4 views
4

Когда я использую следующий код:Почему CGImageCreateWithMaskingColors() возвращает nil в этом случае?

UIImage *image=[UIImage imageNamed:@"loginf1.png"]; 
CGImageRef rawImageRef=image.CGImage; 

const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; 

CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); 

maskedImageRef всегда равна нулю. Почему это, и что я могу сделать, чтобы исправить это?

ответ

4

У меня была та же проблема. Создаваемый вами CGImageRef имеет только 6 байтов для каждого пикселя с байтом без альфа-канала. Функция маскирования требует CGImageRef с 8 байтами для каждого пикселя, только 6 из них используются без альфа-канала. По крайней мере, я думаю это то, что вызывает его.

В любом случае, исправьте его, создав контекст растрового изображения, рисуя изображение в этом растровом контексте, а затем получите CGImageRef от CGBitmapContextCreateImage.

+0

Я могу добавить точку данных к этой интерпретации. CGImageCreateWithMaskingColors, похоже, не нравится создавать маскированные изображения из изображений с активным альфа-каналом. Что имеет смысл: когда в Риме - или, по крайней мере, при использовании изображений (таких как PNG) с альфа-каналами, используйте встроенный альфа-канал для маскировки. –

+0

Можете ли вы разместить образец кода? – Dejell

0

Причина, по которой это происходит, заключается в том, что вы НЕ МОЖЕТЕ создать изображение маски с альфа-каналом. К сожалению, то, что вы пытаетесь, НЕВОЗМОЖНО.

Единственный способ использовать «CGImageCreateWithMaskingColors (...)», чтобы предоставить ему растровый контекст БЕЗ альфа-канала. Ловушка 22 здесь заключается в том, что невозможно создать контекст растрового изображения без альфа-канала. Разве вы не просто любите Apple?

+0

Откуда вы знаете, что его изображение является альфа-каналом? – Dejell

+4

Вот контекст растрового изображения без альфа-канала: 'CGBitmapContextCreate (nil, W, H, 8, W, CGColorSpaceCreateDeviceGray(), CGBitmapInfo (CGImageAlphaInfo.None.toRaw()))' – mxcl

+0

Или вы можете использовать 'UIGraphicsBeginImageContextWithOptions (size, true , 0) '(т.е. значение' true' для опции 'opaque'). – Rob

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