我是一名相对较新的Swift开发者,我正在使用CILinearGradient CIFilter生成渐变,然后将其用作背景和纹理。一开始我对它的工作方式感到非常满意,直到我意识到它生成的渐变似乎严重偏向光谱的黑色端。
起初我以为自己疯了,但后来我创建了纯黑到白和白到黑的渐变,并将它们并排放在屏幕上。我截了一张屏幕截图并将其带入Photoshop。然后我查看了颜色值。你可以看到每个渐变的末端对齐(一个末端是纯黑色覆盖纯白色,另一个末端则相反),但每个渐变的中点明显偏向黑色端。
这是CIFilter的问题还是我的操作有误?感谢任何了解此事的人提供帮助!
以下是我的代码:
作为另一个后续,我尝试做了一个红蓝渐变(仅改变色调),它是完全线性的(如下所示)。问题似乎在于亮度。
以下是我的代码:
func gradient2colorIMG(UIcolor1: UIColor, UIcolor2: UIColor, width: CGFloat, height: CGFloat) -> CGImage? {
if let gradientFilter = CIFilter(name: "CILinearGradient") {
let startVector:CIVector = CIVector(x: 0 + 10, y: 0)
let endVector:CIVector = CIVector(x: width - 10, y: 0)
let color1 = CIColor(color: UIcolor1)
let color2 = CIColor(color: UIcolor2)
let context = CIContext(options: nil)
if let currentFilter = CIFilter(name: "CILinearGradient") {
currentFilter.setValue(startVector, forKey: "inputPoint0")
currentFilter.setValue(endVector, forKey: "inputPoint1")
currentFilter.setValue(color1, forKey: "inputColor0")
currentFilter.setValue(color2, forKey: "inputColor1")
if let output = currentFilter.outputImage {
if let cgimg = context.createCGImage(output, from: CGRect(x: 0, y: 0, width: width, height: height)) {
let gradImage = cgimg
return gradImage
}
}
}
}
return nil
}
然后我使用以下代码在SpriteKit中调用它(但这只是为了让我在屏幕上看到它们,以便比较函数输出的CGImages)...
if let gradImage = gradient2colorIMG(UIcolor1: UIColor(red: 255.0 / 255.0, green: 255.0 / 255.0, blue: 255.0 / 255.0, alpha: 1.0), UIcolor2: UIColor(red: 0.0 / 255.0, green: 0.0 / 255.0, blue: 0.0 / 255.0, alpha: 1.0), width: 250, height: 80) {
let sampleback = SKShapeNode(path: CGPath(roundedRect: CGRect(x: 0, y: 0, width: 250, height: 80), cornerWidth: 5, cornerHeight: 5, transform: nil))
sampleback.fillColor = .white
sampleback.fillTexture = SKTexture(cgImage: gradImage)
sampleback.zPosition = 200
sampleback.position = CGPoint(x: 150, y: 50)
self.addChild(sampleback)
}
if let gradImage2 = gradient2colorIMG(UIcolor1: UIColor(red: 0.0 / 255.0, green: 0.0 / 255.0, blue: 0.0 / 255.0, alpha: 1.0), UIcolor2: UIColor(red: 255.0 / 255.0, green: 255.0 / 255.0, blue: 255.0 / 255.0, alpha: 1.0), width: 250, height: 80) {
let sampleback2 = SKShapeNode(path: CGPath(roundedRect: CGRect(x: 0, y: 0, width: 250, height: 80), cornerWidth: 5, cornerHeight: 5, transform: nil))
sampleback2.fillColor = .white
sampleback2.fillTexture = SKTexture(cgImage: gradImage2)
sampleback2.zPosition = 200
sampleback2.position = CGPoint(x: 150, y: 150)
self.addChild(sampleback2)
}
作为另一个后续,我尝试做了一个红蓝渐变(仅改变色调),它是完全线性的(如下所示)。问题似乎在于亮度。