我正在尝试使用此代码为UIImage着色,但它似乎反转了颜色 - 为背景着色并将黑色笔划变为白色。
如何为图像的黑色笔划线着色并留下白色背景?这是一个游乐场样本,我尝试了一种技术以及第一种答案建议的另一种技术。
游乐场代码
<div class="container">
</div>
<div class="container-fluid">
</div>
答案 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的特定颜色,默认为黑色(你需要在剪裁到面具之前画画。)