Сохранение маскированного UIImage на диск - PullRequest
1 голос
/ 16 октября 2010

Я пытаюсь сохранить изображение с несколькими масками на диск.

Код ниже объясняет, как я это делаю. MaskImagewithStroke маскирует изображение 2 раза: в первый раз, чтобы создать нерегулярный штрих для текстуры, затем я перемаскирую ее большей маской, чтобы получить штрих от нее. Это был самый лучший способ получить нерегулярный мазок вокруг моей текстуры. Теперь, ради iPhone и его производительности, я бы хотел сгенерировать все маскированные текстуры и сохранить их на диск. Я буду использовать эти файлы в другом приложении для загрузки готовых текстур. процесс маскировки идеален на экране, но при сохранении файла у меня получается черное изображение с нерегулярным мазком, НО без текстуры ... Как я могу это изменить?

Я вызываю метод masImageWihStrokandSaveToFile, чтобы запустить процесс сохранения маски + +.

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