iOS:如何将Alpha通道添加到本机iPhone图片

时间:2014-09-25 09:26:41

标签: ios image mask

我试图掩盖用我的iPhone拍摄的照片。 Here我找到了一种方法。然而,要掩盖的图像显然需要一个alpha通道,而来自iPhone的图片则没有。 所以,我找到this主题讨论如何添加这样一个频道。不幸的是,该代码对我来说并不起作用(Xcode 6,iOS 7/8)

你们有谁知道怎么做到这一点?

提前致谢

2 个答案:

答案 0 :(得分:1)

我尝试了第一个链接的代码:

- (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);
    return [UIImage imageWithCGImage:masked];

}

最初它不起作用,因为我使用的蒙版图像是部分透明的。我重新创建了蒙版图像,确保整个图像都是黑色或白色并且有效。

我在另一个网站上找到了以下信息,这使我得出了这样的结论:

  

注意:蒙版图像不能具有任何透明度。代替,   透明区域必须是白色或黑色和白色之间的某种值。   像素越黑,它变得越不透明。

如果它与您用来从图像选择器加载图像的代码有关,这里是我用来加载图像和掩码的代码:

-(IBAction)selectImageFromCameraRoll:(UIButton *)sender
{
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
    {
        NSArray *media = [UIImagePickerController
                          availableMediaTypesForSourceType: UIImagePickerControllerSourceTypePhotoLibrary];

        if ([media containsObject:(NSString*)kUTTypeImage] == YES) {
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            [picker setMediaTypes:[NSArray arrayWithObject:(NSString *)kUTTypeImage]];

            picker.delegate = self;

            [self presentViewController:picker animated:YES completion:nil];
        }
    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Oops!"
                                                        message:@"This device does not have a photo library."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = [info valueForKey:UIImagePickerControllerMediaType];

    if([mediaType isEqualToString:(NSString*)kUTTypeImage])
    {
        UIImage *photoTaken = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
        self.imageView.image = [self maskImage:photoTaken withMask:[UIImage imageNamed:@"mask.png"]];
    }

    [picker dismissViewControllerAnimated:NO completion:nil];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:nil];
}

这是我使用的蒙版图像的链接:

mask.png下载并重命名该文件。

答案 1 :(得分:0)

好的,我很荣幸回答我自己的问题,因为我的问题本身是错误的,并且建立在假设之上,这可能对任何人都不清楚。我希望,与我相同的逻辑错误的人最终会在这个页面上找到,并且发现这一切都非常有用。

首先让我解释一下出了什么问题:

  1. 我认为 -

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

    我碰到的会影响到 图像,但实际上它会影响该图像的显示 UIImageView

  2. 在我的调试链中,我将屏蔽图像保存为 文件,只是为了一个没有掩码的文件。
  3. 谷歌的结果表明我首先需要添加一个alpha通道 图像,在我可以应用alpha之前。
  4. 所以我迷了好几次,拖着你进去。

    我被困在那张无掩盖的图片上,我向谷歌发出了另一个查询,最后是以下内容:

    http://iphonedevsdk.com/forum/iphone-sdk-development/96918-round-corners-on-uiimage-not-uiimageview.html

    这实际上回答了我的问题。

    -(UIImage *)makeRoundedImage:(UIImage *) image radius: (float) radius;
    

    方法返回带有alpha蒙版的被破坏图像。由于我需要一个完美的圆,我可以摆脱半径参数。

    感谢您的所有想法和耐心。对于给您带来的不便,我深表歉意。