2017-07-26 1 views
2

Je suis nouveau rapide et d'essayer de parvenir essentiellement, Cette image à enter image description herechanger la teinte de l'image dans rapide

Cette image ->

enter image description here

J'utilise ce code from here pour changer la teinte de l'image mais ne pas obtenir la sortie désirée

func tint(image: UIImage, color: UIColor) -> UIImage 
{ 
    let ciImage = CIImage(image: image) 
    let filter = CIFilter(name: "CIMultiplyCompositing") 

    let colorFilter = CIFilter(name: "CIConstantColorGenerator") 
    let ciColor = CIColor(color: color) 
    colorFilter.setValue(ciColor, forKey: kCIInputColorKey) 
    let colorImage = colorFilter.outputImage 

    filter.setValue(colorImage, forKey: kCIInputImageKey) 
    filter.setValue(ciImage, forKey: kCIInputBackgroundImageKey) 

    return UIImage(CIImage: filter.outputImage)! 
} 

Si c'est une question noob, excuses. J'ai été capable de le faire facilement en javascript mais pas en swift.

+1

votre imageview ou une images multiples –

+0

Cette image est appliquée comme un matériau –

Répondre

2

Bonjour, vous pouvez l'utiliser de la manière suivante. D'abord, l'extension UIImage que vous avez utilisée nécessite des mises à jour. vous pouvez copier le code ci-dessous pour Swift 3

extension UIImage{ 
func tint(color: UIColor, blendMode: CGBlendMode) -> UIImage 
{ 

    let drawRect = CGRect(x: 0,y: 0,width: size.width,height: size.height) 
    UIGraphicsBeginImageContextWithOptions(size, false, scale) 
    color.setFill() 
    UIRectFill(drawRect) 
    draw(in: drawRect, blendMode: blendMode, alpha: 1.0) 
    let tintedImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return tintedImage! 
} 
} 

Ensuite, dans votre viewDidLoad où vous utilisez l'image par exemple je l'ai utilisé l'image de IBOutlet imageWood

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.imageWood.image = self.imageWood.image?.tint(color: UIColor.green, blendMode: .saturation) 
} 

Vous devrez utiliser la couleur appropriée et les images

L'autre Extension j'ai trouvé

extension UIImage { 

// colorize image with given tint color 
// this is similar to Photoshop's "Color" layer blend mode 
// this is perfect for non-greyscale source images, and images that have both highlights and shadows that should be preserved 
// white will stay white and black will stay black as the lightness of the image is preserved 
func tint(_ tintColor: UIColor) -> UIImage { 

    return modifiedImage { context, rect in 
     // draw black background - workaround to preserve color of partially transparent pixels 
     context.setBlendMode(.normal) 
     UIColor.black.setFill() 
     context.fill(rect) 

     // draw original image 
     context.setBlendMode(.normal) 
     context.draw(self.cgImage!, in: rect) 

     // tint image (loosing alpha) - the luminosity of the original image is preserved 
     context.setBlendMode(.color) 
     tintColor.setFill() 
     context.fill(rect) 

     // mask by alpha values of original image 
     context.setBlendMode(.destinationIn) 
     context.draw(self.cgImage!, in: rect) 
    } 
} 

// fills the alpha channel of the source image with the given color 
// any color information except to the alpha channel will be ignored 
func fillAlpha(_ fillColor: UIColor) -> UIImage { 

    return modifiedImage { context, rect in 
     // draw tint color 
     context.setBlendMode(.normal) 
     fillColor.setFill() 
     context.fill(rect) 

     // mask by alpha values of original image 
     context.setBlendMode(.destinationIn) 
     context.draw(self.cgImage!, in: rect) 
    } 
} 


fileprivate func modifiedImage(_ draw: (CGContext, CGRect) ->()) -> UIImage { 

    // using scale correctly preserves retina images 
    UIGraphicsBeginImageContextWithOptions(size, false, scale) 
    let context: CGContext! = UIGraphicsGetCurrentContext() 
    assert(context != nil) 

    // correctly rotate image 
    context.translateBy(x: 0, y: size.height); 
    context.scaleBy(x: 1.0, y: -1.0); 

    let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height) 

    draw(context, rect) 

    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image! 
} 

}

En utilisant comme ça

self.imageWood.image = self.imageWood.image?.tint(UIColor.purple.withAlphaComponent(1)) 
+0

J'ai utilisé cette méthode. Je remplis toute l'image avec du vert. J'ai essayé de multiplier, sourceIn, sourceOut comme modes de fusion mais tous ont le même effet ... comment obtenir seulement les lignes pour changer de couleur? Les images originales alpha doivent être multipliées à droite? –

+0

Utilisez-vous un fichier .png ou .jpg? aussi vous devez vous assurer que l'image est transparente dans les boîtes et que les lignes sont visibles de sorte que l'effet est appliqué uniquement sur les lignes –

+0

c'est un png .. l'espace entre les lignes est transparent (alpha 0) –

0

Essayez le code ci-dessous, devrait travailler pour vous.

if let myImage = UIImage(named: "imageName")?.withRenderingMode(.alwaysTemplate) { 
     myImageView.image = myImage 
     myImageView.tintColor = UIColor.white 
    } 
0

Votre image est simple et n'a une couleur. Je suggère de rendre votre image transparente, sauf où les lignes sont, puis couchez-le sur un fond blanc pour obtenir vos résultats.

Il semble que vous ayez obtenu les résultats que vous recherchez après avoir utilisé les modes de dessin. Il existe également un certain nombre de filtres d'image Core qui vous permettent d'appliquer des effets de teinte aux images, ainsi que de remplacer des couleurs spécifiques. Ce serait un bon choix pour des images plus complexes.

+0

L'image est transparente à l'exception des lignes. SO l'affiche ici avec le blanc rempli. –