2010-07-21 1 views
1

У меня есть маски с альфа-каналом, чистый черно-белый с черным полигоном в центре, окруженным белым.UIImage masking дает черный фон на iPhone (а не в симуляторе)

У меня есть изображение png, которое я хотел бы замаскировать. у png есть альфа-канал. , используя метод ниже: ok на симуляторе, но фон черный на устройстве ... любая идея исправить это?

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 

CGImageRef maskRef = maskImage.CGImage; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 

//CGImageRelease(mask); 
//CGImageRelease(maskRef); 
return [UIImage imageWithCGImage:masked]; 

}

ответ

2

Решение проблемы: Решение: изображение для маскировки ДОЛЖНО быть создано с альфа-каналом. Канал Alpha не может быть создан из кода.

+0

У меня такая же проблема. можете ли вы опубликовать образец кода о том, как создать альфа-канал? – lxcid

+0

Спасибо Тиби. Для меня также важно, чтобы у maskImage был альфа-канал. Так как изображения iOS7 BOTH, изображение для маскировки и сама маска должны иметь альфа-канал. – sust86

0

же здесь со следующим кодом

- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 
CGImageRef maskRef = maskImage.CGImage; 
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef sourceImage = [image CGImage]; 
CGImageRef imageWithAlpha = sourceImage; 
//add alpha channel for images that don't have one (ie GIF, JPEG, etc...) 
//this however has a computational cost 
if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) { 
    imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage); 
} 

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); 
//const float colorMasking[6] = { 100,100, 100, 250,250, 250}; 
//CGImageRef maskedImageRef = CGImageCreateWithMaskingColors(temp.CGImage, colorMasking); 
CGImageRelease(mask); 

//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel 
if (sourceImage != imageWithAlpha) { 
    CGImageRelease(imageWithAlpha); 
} 

UIImage* retImage = [UIImage imageWithCGImage:masked]; 
CGImageRelease(masked); 

return retImage; 

}

CGImageRef CopyImageAndAddAlphaChannel(CGImageRef sourceImage) { 
CGImageRef retVal = NULL; 

size_t width = CGImageGetWidth(sourceImage); 
size_t height = CGImageGetHeight(sourceImage); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 
                 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst); 

if (offscreenContext != NULL) { 
    CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage); 

    retVal = CGBitmapContextCreateImage(offscreenContext); 
    CGContextRelease(offscreenContext); 
} 

CGColorSpaceRelease(colorSpace); 

return retVal; 

}

отлично работает на тренажере, но не на iPhone устройства: все изображения являются ma но с черным фоном.

+0

Я использовал ваш код, и я думаю, что проблема заключается в строке «CGImageGetAlphaInfo (sourceImage) == kCGImageAlphaNone». В моем случае это всегда было ложным, не форсируя! для добавления альфа-канала. Добавление альфа-канала всегда срабатывало. – AlexVogel