我正在尝试从两个现有图像的合成中创建一个图像蒙版.
首先,我首先创建一个复合材料,它包含一个小图像作为遮罩图像,一个较大的图像与背景相同:
UIImage * BaseTextureImage = [UIImage imageNamed:@"background.png"]; UIImage * MaskImage = [UIImage imageNamed:@"my_mask.jpg"]; UIImage * ShapesBase = [UIImage imageNamed:@"largerimage.jpg"]; UIImage * MaskImageFull; CGSize finalSize = CGSizeMake(480.0, 320.0); UIGraphicsBeginImageContext(finalSize); [ShapesBase drawInRect:CGRectMake(0, 0, 480, 320)]; [MaskImage drawInRect:CGRectMake(150, 50, 250, 250)]; MaskImageFull = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
我可以输出这个UIImage(MaskImageFull),它看起来是正确的,它是一个全尺寸的背景大小,它是一个白色背景,我的面具对象是黑色的,在屏幕上的正确位置.
然后我通过这个传递MaskImageFull UIImage:
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); UIImage* retImage= [UIImage imageWithCGImage:masked];
问题是retImage全黑.如果我将预制的UIImage作为掩码发送它可以正常工作,那就是当我尝试从多个图像中创建它时它会断开.
我认为这是一个色彩空间的东西,但似乎无法解决它.任何帮助深表感谢!
我用CGImageCreateWithMask尝试了同样的事情,得到了相同的结果.我发现的解决方案是使用CGContextClipToMask代替:
CGContextRef mainViewContentContext; CGColorSpaceRef colorSpace; colorSpace = CGColorSpaceCreateDeviceRGB(); // create a bitmap graphics context the size of the image mainViewContentContext = CGBitmapContextCreate (NULL, targetSize.width, targetSize.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); // free the rgb colorspace CGColorSpaceRelease(colorSpace); if (mainViewContentContext==NULL) return NULL; CGImageRef maskImage = [[UIImage imageNamed:@"mask.png"] CGImage]; CGContextClipToMask(mainViewContentContext, CGRectMake(0, 0, targetSize.width, targetSize.height), maskImage); CGContextDrawImage(mainViewContentContext, CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledWidth, scaledHeight), self.CGImage); // Create CGImageRef of the main view bitmap content, and then // release that bitmap context CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext); CGContextRelease(mainViewContentContext); // convert the finished resized image to a UIImage UIImage *theImage = [UIImage imageWithCGImage:mainViewContentBitmapContext]; // image is retained by the property setting above, so we can // release the original CGImageRelease(mainViewContentBitmapContext); // return the image return theImage;