图像遮罩后保持正确的色彩 [英] Keeping right tints after image masking

查看:91
本文介绍了图像遮罩后保持正确的色彩的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要以编程方式使用从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 *)带遮罩的图像:(UIImage *)maskImage 
{
CGImageRef maskRef = maskImage.CGImage;

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBitsPerPixel(maskRef), (maskRef),
CGImageGetDataProvider(maskRef),NULL,false);

CGImageRef masked = CGImageCreateWithMask([image CGImage],mask);

UIImage * im = [UIImage imageWithCGImage:masked];

CGImageRelease(已屏蔽);
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);

[颜色设置];
CGContextFillRect(context,rect);

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

返回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();
返回newImage;
}

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



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

解决方案

受此帖子我最终实现了任务。



这是原始图片:





然后我画了一个此图像的蒙版不填充特殊区域:





在绘制此方法的主要方法下面:

  -(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 applyMask: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();
返回newImage;
}

-(UIImage *)applyMask:(UIImage *)maskImage
{
CGImageRef maskRef = maskImage.CGImage;

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBitsPerPixel(maskRef), (maskRef),
CGImageGetDataProvider(maskRef),NULL,false);

CGImageRef masked = CGImageCreateWithMask([self CGImage],mask);

UIImage * im = [UIImage imageWithCGImage:masked
比例尺:[[UIScreen mainScreen]比例尺]
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);

[颜色设置];

CGContextFillRect(context,rect);

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

return colouredImage;
}

结果如下:




I need to fill programmatically image with different colors with mask I got from our designer in photoshop file: http://image.openlan.ru/images/83339350420766181806.png

I almost finish this except of details I missed:

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

Where methods implementations:

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

My current result is: http://image.openlan.ru/images/34429534616655410787.png

I don't think if I use gradient, I'll see right result. What I don't like now is lack of tints in some image areas. What am I doing wrong here?

解决方案

Inspired by this post I implemented my task eventually.

It's an origin image:

Then I drew a mask for this image do not fill special areas:

Below main method drawing this:

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

Where I use category of UIImage with methods:

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

And result looks:

这篇关于图像遮罩后保持正确的色彩的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆