Ios 平滑地将梯度应用于图像
我尝试使用CoreGraphic将梯度应用于UIImage;然而,我得到的结果不是很好。我想在图像底部创建一个从黑色到透明的渐变,为我放置一些文本创建一个对比度。然而,我能做的梯度不能很好地与图像融合您可以清楚地看到中间的分隔。我正在寻找的结果类似于此应用程序: 我应该如何应用渐变来实现这一点?(我必须将此应用于大量图像) 我的结果是: 这是我的密码:Ios 平滑地将梯度应用于图像,ios,swift,uiimage,core-graphics,Ios,Swift,Uiimage,Core Graphics,我尝试使用CoreGraphic将梯度应用于UIImage;然而,我得到的结果不是很好。我想在图像底部创建一个从黑色到透明的渐变,为我放置一些文本创建一个对比度。然而,我能做的梯度不能很好地与图像融合您可以清楚地看到中间的分隔。我正在寻找的结果类似于此应用程序: 我应该如何应用渐变来实现这一点?(我必须将此应用于大量图像) 我的结果是: 这是我的密码: func imageWithGradient(img:UIImage!) -> UIImage{ UIGraphicsBegi
func imageWithGradient(img:UIImage!) -> UIImage{
UIGraphicsBeginImageContext(img.size)
var context = UIGraphicsGetCurrentContext()
img.drawAtPoint(CGPointMake(0, 0))
let colorSpace = CGColorSpaceCreateDeviceRGB()
let locations:[CGFloat] = [0.50, 1.0]
//1 = opaque
//0 = transparent
let bottom = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).CGColor
let top = UIColor(red: 0, green: 0, blue: 0, alpha: 0).CGColor
let gradient = CGGradientCreateWithColors(colorSpace,
[top, bottom], locations)
let startPoint = CGPointMake(img.size.width/2, 0)
let endPoint = CGPointMake(img.size.width/2, img.size.height)
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
我在Swift操场上试过,我无法复制您描述的确切问题,但是这里有一些建议,您可以尝试 你可以改变你在渐变中设置止损点的方式,我认为更合理的做法是不使用止损点移动渐变,而是移动起点,也就是说,不从上边缘开始,而是从垂直中心开始,类似这样
UIGraphicsBeginImageContext(image.size)
var context = UIGraphicsGetCurrentContext()
image.drawAtPoint(CGPointMake(0, 0))
let colorSpace = CGColorSpaceCreateDeviceRGB()
let locations:[CGFloat] = [0.0, 1.0]
let bottom = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).CGColor
let top = UIColor(red: 0, green: 0, blue: 0, alpha: 0).CGColor
let gradient = CGGradientCreateWithColors(colorSpace,
[top, bottom], locations)
let startPoint = CGPointMake(image.size.width / 2, image.size.height / 2)
let endPoint = CGPointMake(image.size.width / 2, image.size.height)
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0)
let finalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
请注意,位置现在为0和1,而startPoint
y坐标已向下移动
或者,将传递
KCGGradientDrawsBeforRestartLocation
作为CGContextDrawLinearGradient
的一个选项,因为这也可能会产生不同。SWIFT 3
func imageWithGradient(img:UIImage!) -> UIImage {
UIGraphicsBeginImageContext(img.size)
let context = UIGraphicsGetCurrentContext()
img.draw(at: CGPoint(x: 0, y: 0))
let colorSpace = CGColorSpaceCreateDeviceRGB()
let locations:[CGFloat] = [0.0, 1.0]
let bottom = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor
let top = UIColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor
let colors = [top, bottom] as CFArray
let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: locations)
let startPoint = CGPoint(x: img.size.width/2, y: 0)
let endPoint = CGPoint(x: img.size.width/2, y: img.size.height)
context!.drawLinearGradient(gradient!, start: startPoint, end: endPoint, options: CGGradientDrawingOptions(rawValue: UInt32(0)))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
尝试将起始点和端点的Y设置为超出图像边界,这样渐变大小将更高,颜色差异将不太明显。例如,将起点Y设置为
-img.size.height/4
和终点img.size.height*1.25
。如果屏幕末端的颜色看起来太透明,则稍微增加底部颜色alphaaswell@zellb我试过了,中间的线条仍然很清晰。与我展示的链接中的应用程序不同,它非常平滑。你知道应用过滤器有什么用吗?还是在photoshop中创建一个过滤器并将其应用到另一个图像上更好。谢谢!对我来说工作很完美。我只需更改位置=[0.7,1.0]即可覆盖图像的底部。