iOS: como criar a imagem despojada?
Resposta actualizada:
Graças ao Simon Gladman, crio uma função para fazer uma cor despojada. Mas eu não consegui fazer a rotação, talvez por causa dos atributos fromRect.// create a striped color
func strippedColor(color1: UIColor, _ color2: UIColor, width: CGFloat = 1) -> UIColor {
let context = CIContext()
let blurFilter = CIFilter(name: "CIStripesGenerator")!
blurFilter.setValue(CIColor(color: color1), forKey: "inputColor0")
blurFilter.setValue(CIColor(color: color2), forKey: "inputColor1")
blurFilter.setValue(width, forKey: "inputWidth")
let ref = context.createCGImage(blurFilter.outputImage!, fromRect: CGRect(x: 0, y: 0, width: 2*width, height: 1))
let ref2 = ref
//let rotateFilter = CIFilter(name: "CIStraightenFilter")!
//rotateFilter.setValue(CIImage(CGImage: ref), forKey: "inputImage")
//rotateFilter.setValue(NSNumber(double: 2), forKey: "inputAngle")
//let ref2 = context.createCGImage(rotateFilter.outputImage!, fromRect: rotateFilter.outputImage!.extent)
let uiimage = UIImage(CGImage: ref2)
let uicolor = UIColor(patternImage: uiimage)
return uicolor
}
3 answers
A rotação não funciona no post original (actualizado) devido ao uso de CIStraightenFilter. Este filtro provavelmente não está destinado a ser usado como um filtro de rotação geral, uma vez que provavelmente irá apenas endireitar a imagem:)
Acho que a CIAffineTransform é mais adequada para isso.O seguinte exemplo gera uma risca e roda-a 45 graus e funciona bem para mim.
Swift 3:
fileprivate func generateImage(_ width: CGFloat, _ height: CGFloat) -> UIImage {
let context = CIContext()
let stripes = CIFilter(name: "CIStripesGenerator", withInputParameters: [
"inputColor0" : CIColor(red: 0.000, green: 0.000, blue: 0.000),
"inputColor1" : CIColor(red: 0.259, green: 0.259, blue: 0.259),
"inputWidth" : NSNumber(value: 2.0),
"inputSharpness" : NSNumber(value: 0.0)
])!.outputImage!
let rotated = CIFilter(name: "CIAffineTransform", withInputParameters: [
"inputImage" : stripes,
"inputTransform" : NSValue(cgAffineTransform: CGAffineTransform(rotationAngle: 45.0))
])!.outputImage!
return UIImage(cgImage: context.createCGImage(rotated, from: CGRect(x: 0, y: 0, width: width, height: height))!)
}
Se fosse eu, usaria o filtro de CoreImage {[[0]} para criar o padrão de listras e depois acorrentá-lo a um CIStraightenFilter
para rodá-lo por radianos pi 1/4.
Criar o padrão com um filtro dá-lhe o controlo durante o tempo de execução sobre a largura e as cores da faixa.
Aqui .
Saúde! SimãoSe está apenas a criar o mesmo padrão vezes sem conta, então pode usar isto...
let stripedColor = UIColor(patternImage: stripedPatternImage)
A imagem de padrão apenas contém uma única "unidade" da faixa que se repete vezes sem conta criando o padrão que você quer.