Я пытаюсь сделать градиент и использовать его как альфа-маску. Прямо сейчас я могу сделать изображение, подобное этому (от черного до прозрачного):
Это код, который я использую, чтобы сделать все это:
private func createImage(width: CGFloat, height: CGFloat) -> CGImageRef?{
if let ciFilter = CIFilter(name: "CILinearGradient"){
let ciContext = CIContext()
ciFilter.setDefaults()
let startColor = CIColor(red: 0, green: 0, blue: 0, alpha: 0)
let endColor = CIColor(red: 0, green: 0, blue: 0, alpha: 1)
let startVector = CIVector(x: 0, y: height-10)
let endVector = CIVector(x: 0, y: height-22)
ciFilter.setValue(startColor, forKey: "inputColor0")
ciFilter.setValue(endColor, forKey: "inputColor1")
ciFilter.setValue(startVector, forKey: "inputPoint0")
ciFilter.setValue(endVector, forKey: "inputPoint1")
if let outputImage = ciFilter.outputImage {
let cgImage:CGImageRef = ciContext.createCGImage(outputImage, fromRect: CGRect(x: 0, y: 0, width: width, height: height))
return cgImage
}
}
return nil
}
Для меня этот способ работает почти идеально, потому что я создаю маску только один раз в своем коде (когда создается элемент GUI), поэтому производительность вообще не влияет.
Дело в том, что мне на самом деле нужно, чтобы результирующее изображение (текстура градиента) выглядело так (градиенты должны иметь фиксированную высоту, но размер черной области может варьироваться):
Поскольку фильтр CILinearGradient
не имеет параметра inputImage
, я не могу соединить два фильтра один за другим. Но скорее мне нужно создать изображение и применить фильтр, а затем создать другое изображение и применить новый фильтр.
Я решил это так же, как описано выше. Также мне пришлось расширить процесс в три шага (создать верхний градиент, создать среднюю, черную область и создать нижний градиент), а затем объединить все это в одно изображение.
Интересно, есть ли что-нибудь о CILinearGradient фильтр, о котором я не знаю? Может быть, есть более простой способ решить эту проблему и сделать сложный градиент?
Обратите внимание, что я использую SpriteKit, и решение этой проблемы с помощью CAGradientLayer — не тот путь, которым я хочу идти.