CGImageCreateWithMaskingColors不适用于iOS7

sur*_*eal 4 objective-c uiimage ios ios7

我在iOS5和iOS6上开发了一个应用程序.在我升级到XCode 5和iOS7后,我有一些新的bug.

主要的是colorMasking不再有效.完全相同的代码仍可编译并适用于iOS6手机.在iOS7上,蒙面颜色仍然存在.我试图在谷歌上找到答案,但还没找到答案.这是iOS7的错误,还是有人知道更好的做彩色掩模的方法?

这是代码:

- (UIImage*) processImage :(UIImage*) image
{
    UIImage *inputImage = [UIImage imageWithData:UIImageJPEGRepresentation(image, 1.0)];
    const float colorMasking[6]={100.0, 255.0, 0.0, 100.0, 100.0, 255.0};
    CGImageRef imageRef = CGImageCreateWithMaskingColors(inputImage.CGImage, colorMasking);
    UIImage* finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return finalImage;
}
Run Code Online (Sandbox Code Playgroud)

以下是我发现的几个StackOverflow帖子,帮助我在iOS6中首先使用它: 透明度iOS iOS颜色在UIImage中透明

Rob*_*Rob 8

我曾经穿过的一些奇怪的行为迷迷糊糊CGImageCreateWithMaskingColors会同UIImagePNGRepresentation.这可能与您的问题有关,也可能与您无关.我发现如果:

  1. 如果使用CGImageCreateWithMaskingColors并立即将该图像添加到图像视图,我可以看到透明度似乎已正确应用;

  2. 但是在iOS 7中,如果我那么:

    • 从中获取此图像CGImageCreateWithMaskingColors并创建一个NSData使用UIImagePNGRepresentation; 和

    • 如果从NSData使用中重新加载图像imageWithData,则生成的图像将不再具有透明度.

    要确认这一点,如果我writeToFile为此NSData并在Photoshop等工具中检查保存的图像,我可以确认该文件没有应用任何透明度.

    这仅在iOS 7中体现出来.在iOS 6中它很好.

  3. 但是,如果我在步骤1中拍摄图像并将其往返drawInRect,则保存图像并随后加载图像的过程相同.

以下代码说明了此问题:

- (UIImage*) processImage :(UIImage*) inputImage
{
    const float colorMasking[6] = {255.0, 255.0, 255.0, 255.0, 255.0, 255.0};
    CGImageRef imageRef = CGImageCreateWithMaskingColors(inputImage.CGImage, colorMasking);
    UIImage* finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    // If I put this image in an image view, I see the transparency fine.

    self.imageView.image = finalImage;                           // this works

    // But if I save it to disk and the file does _not_ have any transparency

    NSString *documentsPath           = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *pathWithoutTransparency = [documentsPath stringByAppendingPathComponent:@"image-but-no-transparency.png"];
    NSData   *data                    = UIImagePNGRepresentation(finalImage);
    [data writeToFile:pathWithoutTransparency atomically:YES];   // save it so I can check out the file in Photoshop

    // In iOS 7, the following imageview does not honor the transparency

    self.imageView2.image = [UIImage imageWithData:data];        // this does not work in iOS 7

    // but, if I round-trip the original image through `drawInRect` one final time,
    // the transparency works

    UIGraphicsBeginImageContextWithOptions(finalImage.size, NO, 1.0);
    [finalImage drawInRect:CGRectMake(0, 0, finalImage.size.width, finalImage.size.height)];
    UIImage *anotherRendition = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    data = UIImagePNGRepresentation(anotherRendition);
    NSString *pathWithTransparency = [documentsPath stringByAppendingPathComponent:@"image-with-transparancy.png"];
    [data writeToFile:pathWithTransparency atomically:YES];

    // But this image is fine

    self.imageView3.image = [UIImage imageWithContentsOfFile:pathWithTransparency];   // this does work

    return anotherRendition;
}
Run Code Online (Sandbox Code Playgroud)