В приложении iPhone
у меня есть набор черно-белых изображений. Мне нужна функция, которая меняет белые области изображения на прозрачные, а черные на произвольный цвет.
Я пытаюсь создать сплошной цвет (черный или белый) CGImageRef
, а затем маскирую его своим исходным изображением. Это почти работает, но области, которые должны быть прозрачными, прозрачны примерно на 1%.
Вот функция, которую я имею. Он принимает boolean
, чтобы определить, должно ли твердое тело color
быть черным или белым.
- (UIImage*) imageWithMask:(UIImage *) maskImage andIsWhite:(BOOL) isWhite {
CGImageRef maskImageRef = [maskImage CGImage];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, maskImage.size.width, maskImage.size.width, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
if (isWhite) {
CGContextSetRGBFillColor(context, (CGFloat)1.0, (CGFloat)1.0, (CGFloat)1.0, (CGFloat)1.0 );
} else {
CGContextSetRGBFillColor(context, (CGFloat)0.0, (CGFloat)0.0, (CGFloat)0.0, (CGFloat)1.0 );
}
CGContextAddRect(context, CGRectMake(0, 0, maskImage.size.width, maskImage.size.height));
CGContextFillRect(context, CGRectMake(0, 0, maskImage.size.width, maskImage.size.height));
CGImageRef solidImage = CGBitmapContextCreateImage(context);
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskImageRef),
CGImageGetHeight(maskImageRef),
CGImageGetBitsPerComponent(maskImageRef),
CGImageGetBitsPerPixel(maskImageRef),
CGImageGetBytesPerRow(maskImageRef),
CGImageGetDataProvider(maskImageRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask(solidImage, mask);
UIImage *maskedUIImage = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);
return maskedUIImage;
}
Любые предложения приветствуются.