Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 平滑地将梯度应用于图像_Ios_Swift_Uiimage_Core Graphics - Fatal编程技术网

Ios 平滑地将梯度应用于图像

Ios 平滑地将梯度应用于图像,ios,swift,uiimage,core-graphics,Ios,Swift,Uiimage,Core Graphics,我尝试使用CoreGraphic将梯度应用于UIImage;然而,我得到的结果不是很好。我想在图像底部创建一个从黑色到透明的渐变,为我放置一些文本创建一个对比度。然而,我能做的梯度不能很好地与图像融合您可以清楚地看到中间的分隔。我正在寻找的结果类似于此应用程序: 我应该如何应用渐变来实现这一点?(我必须将此应用于大量图像) 我的结果是: 这是我的密码: func imageWithGradient(img:UIImage!) -> UIImage{ UIGraphicsBegi

我尝试使用CoreGraphic将梯度应用于UIImage;然而,我得到的结果不是很好。我想在图像底部创建一个从黑色到透明的渐变,为我放置一些文本创建一个对比度。然而,我能做的梯度不能很好地与图像融合您可以清楚地看到中间的分隔。我正在寻找的结果类似于此应用程序: 我应该如何应用渐变来实现这一点?(我必须将此应用于大量图像)

我的结果是:

这是我的密码:

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]即可覆盖图像的底部。