在图像掩蔽后保持正确的色调

时间:2015-01-10 10:36:36

标签: ios core-graphics

我需要使用我在photoshop文件中从设计师那里获得的面具以不同的颜色以图形方式填充图像: http://image.openlan.ru/images/83339350420766181806.png

除了我错过的细节之外,我几乎完成了这个:

UIImage *mask = [UIImage imageNamed:@"mask.png"];
UIImage *image = [UIImage imageNamed:@"vehicle.png"];

mask = [image maskImage:image withMask:mask];
image = [image coloredImageWithColor:[UIColor blueColor]];
image = [image drawImage:mask inImage:image];

方法实施:

- (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);

    UIImage *im = [UIImage imageWithCGImage:masked];

    CGImageRelease(masked);
    CGImageRelease(maskRef);
    CGImageRelease(mask);

    return im;
}

- (UIImage *) coloredImageWithColor:(UIColor *)color
{
    UIGraphicsBeginImageContext(self.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextTranslateCTM(context, 0, self.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextSetBlendMode(context, kCGBlendModeDarken);
    CGRect rect = (CGRect){ CGPointZero, self.size };
    CGContextDrawImage(context, rect, self.CGImage);
    CGContextClipToMask(context, rect, self.CGImage);

    [color set];
    CGContextFillRect(context, rect);

    UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return coloredImage;
}

- (UIImage *) drawImage:(UIImage *)fgImage inImage:(UIImage *)bgImage
{
    UIGraphicsBeginImageContextWithOptions(bgImage.size, FALSE, 0.0);
    [bgImage drawInRect:(CGRect){ CGPointZero, bgImage.size }];
    [fgImage drawInRect:(CGRect){ CGPointZero, fgImage.size }];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

我目前的结果是: http://image.openlan.ru/images/34429534616655410787.png

我不认为如果使用渐变,我会看到正确的结果。我现在不喜欢的是某些图像区域缺乏色调。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

受此post的启发,我最终实现了我的任务。

它是原始图像:

enter image description here

然后我为这张图片画了一个面具,不填充特殊区域:

enter image description here

主要方法如下:

- (void) vehicleConfigure
{
    NSString *vehicleName = @"sports.png";
    UIImage *vehicleImage = [UIImage imageNamed:vehicleName];

    vehicleName = [vehicleName stringByReplacingOccurrencesOfString:@".png" withString:@"-mask.png"];
    UIImage *mask = [UIImage imageNamed:vehicleName];
    mask = [vehicleImage applyingMask:mask];

    vehicleImage = [vehicleImage coloredImageWithColor:RGB(30, 128, 255)];
    vehicleImage = [vehicleImage drawMask:mask];

    m_vehicleImageView.contentMode = UIViewContentModeScaleAspectFit;
    m_vehicleImageView.image = vehicleImage;
}

我使用UIImage类别的方法:

- (UIImage *) drawMask:(UIImage *)mask
{
    UIGraphicsBeginImageContextWithOptions(self.size, FALSE, 0.0);
    [self drawInRect:(CGRect){ CGPointZero, self.size }];
    [mask drawInRect:(CGRect){ CGPointZero, mask.size }];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

- (UIImage *) applyingMask:(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([self CGImage], mask);

    UIImage *im = [UIImage imageWithCGImage:masked
                                      scale:[[UIScreen mainScreen] scale]
                                orientation:UIImageOrientationUp];

//    CGImageRelease(masked);
//    CGImageRelease(maskRef);
//    CGImageRelease(mask);

    return im;
}

- (UIImage *) coloredImageWithColor:(UIColor *)color
{
    UIGraphicsBeginImageContext(self.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextTranslateCTM(context, 0, self.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextSetBlendMode(context, kCGBlendModeColorBurn);
    CGRect rect = (CGRect){ CGPointZero, self.size };

    CGContextDrawImage(context, rect, self.CGImage);
    CGContextClipToMask(context, rect, self.CGImage);

    [color set];

    CGContextFillRect(context, rect);

    UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return coloredImage;
}

结果看起来:

enter image description here

相关问题