我有一个没有背景的 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()
}
}
所以我知道 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()
}
}