我有一个没有背景的 png 文件,如何在 iOS 中为该图像创建清晰的彩色背景?

I have a png file with no background, how can I create a clear color background for this image in iOS?

所以我知道 UIImage 本质上没有背景。正如我们许多人所知,许多 PNG 文件没有背景颜色,因此很清楚。我正在尝试上传一个没有背景颜色的 png 文件,因此颜色很清晰。是的,我知道我可以在 adobe 或 sketch 中自己设置背景颜色,但我假设其他用户不知道如何执行此操作。

这是我创建的 png 的屏幕截图:

如您所见,它只是合并在一起的两条线,因此没有设置背景。

下面是使用 imagePicker 从我的相册中选择此 png 图像后的屏幕截图。

请注意,应该是透明的区域实际上是黑色的。我想在黑色部分上色并使其实际上变为 clearColor 并保持绿色十字不变。现在,我不确定黑色是否真的是黑色,因为它可能只是空的 space。我可以把空的黑色填满space然后变成清澈的颜色吗?

这是我现在的代码,但效果不是很好:

func overlayImage(image: UIImage, color: UIColor) -> UIImage? {
    let rect = CGRectMake(0, 0, image.size.width, image.size.height)
    let backgroundView = UIView(frame: rect)
    backgroundView.backgroundColor = color
    UIGraphicsBeginImageContext(rect.size)

    let gcSize: CGSize = backgroundView.frame.size
    UIGraphicsBeginImageContext(gcSize)

    let context: CGContextRef = UIGraphicsGetCurrentContext()!

    backgroundView.layer.renderInContext(context)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

任何对 obj-C 或 Swift 的帮助将不胜感激。

我摆脱了上面的叠加方法,现在使用下面的代码:

已更新新代码但仍然无效

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
    scaleImage(overlayImage(image, color: UIColor.clearColor()))
}

func scaleImageAndAddAugmented(image: UIImage?) {
    let rect = CGRectMake(0, 0, image!.size.width, image!.size.height)
    let backgroundView = UIView(frame: rect)
    backgroundView.backgroundColor = UIColor.clearColor()

    let size = CGSizeApplyAffineTransform(image!.size, CGAffineTransformMakeScale(0.25, 0.25))
    let hasAlpha = false
    let scale: CGFloat = 0.0

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
    image!.drawInRect(CGRect(origin: CGPointZero, size: size))

    let context = CGBitmapContextCreate(nil, Int(image!.size.width), Int(image!.size.height), 8, 0,  CGColorSpaceCreateDeviceRGB(), CGImageAlphaInfo.PremultipliedLast.rawValue)

    let myGeneratedImage  = CGBitmapContextCreateImage(context)

    CGContextDrawImage(context, rect, myGeneratedImage)

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    self.dismissViewControllerAnimated(true, completion: nil)

    // set image below
}

当您只能从文件创建图像时,使用 UIGraphicsGetImageFromCurrentImageContext 从上下文生成图像似乎有些多余的工作。

如前所述,需要 Opaque = NO:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

我敢打赌它是图像本身,因为整个图像都褪色了。

100% 确定传递的颜色是清晰的颜色:

backgroundView.backgroundColor = color

您可以创建位图上下文并改用它:

CGContextRef context = CGBitmapContextCreate(NULL,
                                     width,
                                     height,
                                     8,
                                     0,
                                     rgbColorSpace,
                                     kCGImageAlphaPremultipliedLast);

而不是使用当前上下文,您可以使用:

myGeneratedImage  = CGBitmapContextCreateImage(context)

画画很容易:

CGContextDrawImage(realContext,bounds,myGeneratedImage)

Swift 代码如下:

func scaleImage(image: UIImage?) {
    if let image = image {
        let rect = CGRectMake(0, 0, image.size.width, image.size.height)

        let size: CGSize = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.25, 0.25))

        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        image.drawInRect(CGRect(origin: CGPointZero, size: size))

        let context = CGBitmapContextCreate(nil, Int(image.size.width), Int(image.size.height), 8, 0,  CGColorSpaceCreateDeviceRGB(), CGImageAlphaInfo.PremultipliedLast.rawValue)

        let myGeneratedImage = CGBitmapContextCreateImage(context)

        CGContextDrawImage(context, rect, myGeneratedImage)

        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    }
}