Tint在swift中反转颜色

时间:2015-09-22 22:11:57

标签: ios swift uiimage uigraphicscontext

我正在尝试使用此代码为UIImage着色,但它似乎反转了颜色 - 为背景着色并将黑色笔划变为白色。

如何为图像的黑色笔划线着色并留下白色背景?这是一个游乐场样本,我尝试了一种技术以及第一种答案建议的另一种技术。

游乐场代码

<div class="container">

</div>
<div class="container-fluid">

</div>

1 个答案:

答案 0 :(得分:1)

这应该可行,我只是用png和透明背景测试它

func tint(color: UIColor, blendMode: CGBlendMode = CGBlendMode.Normal) -> UIImage
{
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale);
    let context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0, self.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, blendMode);
    let rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextClipToMask(context, rect, self.CGImage);
    color.setFill()
    CGContextFillRect(context, rect);
    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

另请参阅this post以获取更多信息。另一种方法是使用UIImageRenderingMode.AlwaysTemplate渲染模式将图像包装在UIImageView中,然后设置tintColor属性。

修改

因此,如果您在图像中没有Alpha通道,则可以使用此功能首先屏蔽某些颜色

func tint(color: UIColor, blendMode: CGBlendMode = CGBlendMode.Normal, colorToMask: UIColor = UIColor.blackColor()) -> UIImage
{
    var fRed : CGFloat = 0
    var fGreen : CGFloat = 0
    var fBlue : CGFloat = 0
    var fAlpha: CGFloat = 0
    colorToMask.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha)

    let rect = CGRectMake(0, 0, self.size.width, self.size.height);
    var colorMasking : [CGFloat] = [fRed,fRed,fGreen,fGreen,fBlue,fBlue]
    let newImageRef = CGImageCreateWithMaskingColors(self.CGImage!, &colorMasking)

    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale);
    let context = UIGraphicsGetCurrentContext();

    CGContextTranslateCTM(context, 0, self.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, blendMode);
    CGContextClipToMask(context, rect, newImageRef!);
    color.setFill()
    CGContextFillRect(context, rect);

    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

此函数首先根据指定的颜色创建蒙版,并将上下文剪辑到此蒙版。

编辑#2

正如评论中所述,我也没有设法掩盖白色,我尝试了UInt8值(即255)和浮点值(即1.0),但它仍然无法正常工作。因此,我能想出的唯一解决方案是反转图像。这是功能:

func negativeImage() -> UIImage {

    let coreImage = MYImage(CGImage: self.CGImage!)
    let filter = CIFilter(name: "CIColorInvert", withInputParameters: ["inputImage" : coreImage])!
    let result = filter.outputImage!
    let context = CIContext(options:nil)
    let cgimg : CGImageRef = context.createCGImage(result, fromRect: result.extent)

    let bmpcontext = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height), 8, Int(self.size.width)*4, CGColorSpaceCreateDeviceRGB(),CGImageAlphaInfo.NoneSkipLast.rawValue)
    CGContextDrawImage(bmpcontext, CGRectMake(0, 0, self.size.width, self.size.height), cgimg)
    let newImgRef = CGBitmapContextCreateImage(bmpcontext)!
    return UIImage(CGImage: newImgRef)
}

您可以像这样使用

var image : UIImage = ...
image = image.negativeImage()
image = image.tint(UIColor.redColor())

以下是一些一般性说明

  • CGImageCreateWithMaskingColors需要带有 NO Alpha通道的CGImage,这就是我在negativeImage函数中使用标记CGImageAlphaInfo.NoneSkipLast以便再次删除Alpha通道的原因
  • 此处绝对没有错误检查,您至少应使用CGImageGetAlphaInfo检查色调函数中是否包含Alpha通道
  • 您可以将屏蔽的部分(在我们的示例中为白色)透明(通过在色调函数中的UIGraphicsBeginImageContextWithOptions命令中设置为false),或通过设置为true的特定颜色,默认为黑色(你需要在剪裁到面具之前画画。)