将屏蔽的UIImage保存到磁盘

时间:2010-10-15 21:53:31

标签: cocoa-touch uikit uiimage save mask

我正在尝试将多个蒙版图像保存到磁盘。

下面的代码解释了我是如何做到的。 maskImagewithStroke掩盖了2次图片:第一次为纹理提供不规则的笔划然后我用一个更大的蒙版重新掩盖它以从中获取笔划。这是我发现在我的纹理周围出现不规则笔触的麻烦方式。 现在,为了iPhone及其性能,我想生成所有蒙版纹理并将它们保存到磁盘。我将在另一个应用程序中使用thos文件来加载预先屏蔽的纹理。屏蔽过程在屏幕上是完美的,但是当保存文件时,我有一个带有不规则笔触的黑色图像,但没有纹理......我怎么能改变它?

我正在调用masImageWihStrokandSaveToFile方法来启动maskin +保存过程..

-(void)masImageWihStrokandSaveToFile:(UIImage *)image withMask:(UIImage *)maskImage imageIndex:(NSInteger)i{
    //mask image with stroke
    //[self maskImageWithStroke:image withMask:maskImage];
    //save masked image to disk
    // Create paths to output images
    NSString  *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/Test_%d.png",i]];
    NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"];

    // Write a UIImage to JPEG with minimum compression (best quality)
    // The value 'image' must be a UIImage object
    // The value '1.0' represents image compression quality as value from 0.0 to 1.0
    [UIImageJPEGRepresentation([self maskImageWithStroke:image withMask:maskImage], 1.0) writeToFile:jpgPath atomically:YES];

    // Write image to PNG
    [UIImagePNGRepresentation([self maskImageWithStroke:image withMask:maskImage]) writeToFile:pngPath atomically:YES];

    // Let's check to see if files were successfully written...

    // Create file manager
    NSError *error;
    NSFileManager *fileMgr = [NSFileManager defaultManager];

    // Point to Document directory
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

    // Write out the contents of home directory to console
    NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]);
}

- (UIImage *) maskImageWithStroke:(UIImage *)image withMask:(UIImage *)maskImage{
    UIImage* maskedImage = [self maskImage:image withMask:maskImage];

    //****** Add a Stroke - Begin *******//
    //grow the actual mask
    UIImage* biggerMaskImage = [maskImage scaleToSize:CGSizeMake(310,310)];
    //now add a stroke to the image.

    //UIImage *bottomImage = [UIImage imageNamed:@"bottom.png"];
    //UIImage *image = [UIImage imageNamed:@"top.png"];

    CGSize newSize = CGSizeMake(310, 310);
    UIGraphicsBeginImageContext( newSize );

    // Use existing opacity as is
    //[biggerMaskImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    //[biggerMaskImage drawInRect:CGRectMake(0,0,410,410)];
    [maskImage drawInRect:CGRectMake(0,0,310,310)];
    // Apply supplied opacity
    //[retImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:0.8];
    [maskedImage drawInRect:CGRectMake(0,0,300,300) blendMode:kCGBlendModeNormal alpha:1];


    UIImage *maskedStrokedImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    //****** Add a Stroke - End *******//

    //****** Remask - Begin ******//

    maskedStrokedImage = [self maskImage:maskedStrokedImage withMask:biggerMaskImage];

    //****** Remask - End ******//

    return maskedStrokedImage;
}

/*************Mask Images ***************/

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;
}

// masker method
- (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);

    CGImageRelease(mask);

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

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

    return retImage;
}

0 个答案:

没有答案