2013-03-15 3 views
9

Diciamo che ho un UIColorCome posso modificare tonalità, luminosità e saturazione di UIColor?

UIColor *color = [UIColor redColor]; 

Ora voglio modificare la saturazione/tonalità/brigthness, come posso fare questo? Ho letto la documentazione ma sono ancora molto confuso

Desidero modificare l'UIColor creato ([UIColor redColor]) non iniziare un nuovo colore con alcune preferenze. Come posso modificarlo mantenendo l'originale. So del metodo colorWithHue:saturation:brightness:alpha:, ho bisogno di aggiornare le proprietà di un colore esistente, mantenendo il colore rosso.

+0

guardare in questo post http://stackoverflow.com/questions/10071756/is-there-function-to-convert-uicolor-to- hue-satation-brightness – Spire

+0

È possibile utilizzare il framework CoreImage. Questo ti aiuterà molto. –

risposta

18

È possibile chiamare getHue:saturation:brightness:alpha: sul colore, quindi regolare i valori, quindi creare un nuovo colore con i componenti regolabili con +[UIColor colorWithHue:saturation:brightness:alpha:]

CGFloat hue, saturation, brightness, alpha ; 
BOOL ok = [ <color> getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha ] ; 
if (!ok) { 
    // handle error 
} 
// ... adjust components.. 

UIColor * newColor = [ UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha ] ; 
+0

Grazie mille per la risposta, ha funzionato! Lo accetto in un minuto (Stackoverflow dice che devo aspettare) – s6luwJ0A3I

+4

Questo funziona, tuttavia non soddisfa il tuo requisito che sia lo stesso oggetto di colore. Ma quello che vuoi non è possibile. UIColor è immutabile, quindi dovrai sempre creare un nuovo oggetto colore. – nielsbot

+0

@nielsbot Mi piace il tuo uso sintetico di BOOL per uccidere 2 piccioni con una fava, per così dire. Risposta eccellente ... –

0

È possibile utilizzare questo metodo impostando i seguenti valori

UIColor *customColor = [UIColor colorWithHue: x.xx saturation: x.xx brightness: x.xx alpha: 1.0];

0

Si può semplicemente modificare questo da

[UIColor colorWithHue:YourHueValue saturation:YourSaturationValue brightness:YourBrightnessValueValue alpha:1.00]; 

alfa denota l'opacità di vista e si va da 0.0 - 1.0

-4
[UIColor colorWithHue:0.10 saturation:0.16 brightness:0.13 alpha:1.00]; 
+0

Una semplice linea/linee di codice non è considerata una buona risposta. Per favore, spiega anche perché hai fatto cosa e come questo ti sta aiutando. –

0

Ucolore non può modificare la saturazione/tonalità/luminosità, è possibile CoreImage.

Alcuni codice di esempio riportato di seguito:

CIFilter *filter = [CIFilter filterWithName:@"CIColorControls"]; 

[filter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputContrast"]; 
[filter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputSaturation"]; 
[filter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputBrightness"]; 


[filter setValue:_A_CIImage_ forKey:kCIInputImageKey]; 

CIImage *_outputImage = filter.outputImage; 

CIContext context = [CIContext contextWithOptions:nil]; 

CGImageRef outputImageRef = [context createCGImage: _outputImage fromRect:[_outputImage extent]]; 

Se avete qualche domanda circa iOS, si può andare a http://weibo.com/iOSHomePage e lettera privata a me.My completamente risposta capacità.

+0

colorWithHue: satation: brightness: alpha: crea e restituisce un oggetto colore utilizzando i valori del componente dello spazio colore HSB specificato e dell'opacità. Questo metodo è utilizzato per creare un colore con lo spazio colore HSB, come lo spazio colore RGB. Non è possibile modificare un colore rosso in altri colori. – zhoujinhao

0
CGSize imageSize = [ba size]; 
CGRect imageExtent = CGRectMake(0,0,imageSize.width,imageSize.height); 

// Create a context containing the image. 
UIGraphicsBeginImageContext(imageSize); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

[sourceimage drawInRect:imageExtent]; 
// Draw the hue on top of the image. 
CGContextSetBlendMode(context, kCGBlendModeHue); 
[[UIColor colorWithHue:yourvalue saturation:1.0 brightness:1 alpha:1.0] set]; 
UIBezierPath *imagePath = [UIBezierPath bezierPathWithRect:imageExtent]; 
[imagePath fill]; 

CGImageRef imageref=CGBitmapContextCreateImage(context); 

UIImage *result =[UIImage imageWithCGImage:imageref]; 

CGImageRelease(imageref); 

Nelle prime due righe descrive la dimensione dell'immagine e il valore dell'immagine. CGContextRef viene utilizzato per creare un contesto nella grafica di base. Dopo che la quinta riga è l'immagine che si desidera applicare tonalità e retta di immagine. Dopo quella modalità di fusione che è importante. Dopo quell'interfaccia utente colorWithHue in cui vengono passati i valori di tonalità, saturazione, luminosità e alfa. Per ottenere un effetto corretto dare valore 1.0 di alfa. E alla fine dovresti impostare uicolor.create bezerpath o puoi dare direttamente cgcontextsetfill(context). Alla fine crea imageref e metti quella immagine in UIImage. Alla fine, come sempre nelle coreografie, rilasciare CGImageRelease per proteggersi dai problemi di memoria.

+0

Il codice fornito potrebbe essere d'aiuto, ma per renderlo una buona risposta dovresti anche descrivere/spiegare perché/come esattamente il tuo codice risolve il problema. – ZygD

+0

nella prima riga descrive le dimensioni dell'immagine e il rect dell'immagine. cgcontext viene utilizzato per creare un contesto nella grafica di base. Dopo che la quinta riga è l'immagine, si desidera applicare la tonalità e il retto dell'immagine. dopo quella modalità di fusione che è importante. Dopo che ui colorWithHue in cui il valore di passaggio di tonalità, saturazione, luminosità e alfa per ottenere il giusto effetto fornisce valore 1.0 di alpha.e alla fine set uicolor.create bezerpath o puoi dare direttamente cgcontextsetfill (context). Alla fine crea imageref e metti quell'immagine in uiimage .AT alla fine sempre nella release coreografica cgimageRef contro il problema della memoria. –

+0

È sempre meglio inserire le informazioni rilevanti nella risposta, poiché non tutti, se hanno un problema simile, analizzeranno i commenti. Inoltre, cosa intendevi per [coreografia] (http://www.thefreedictionary.com/choreographic)? – ZygD

2

purtroppo è piuttosto una seccatura a modificare le hsba o rgba valori di un UIColor di default.Utilizzando HandyUIKit (installarlo via Cartagine) rende la vita molto più facile:

import HandyUIKit 

// each line creates a new UIColor object with the new value 
color.change(.hue,  to: 0.1) 
color.change(.brightness, to: 0.2) 
color.change(.saturation, to: 0.3) 
color.change(.alpha,  to: 0.4) 

// chaining them returns a single new object with all values changed 
color.change(.hue,  to: 0.5) 
    .change(.brightness, to: 0.6) 
    .change(.saturation, to: 0.7) 

Ci sono anche opzioni per applicare variazioni relative:

// create a new UIColor object with hue & brightness increased by 0.2 
color.change(.hue,  by: 0.2) 
    .change(.brightness, by: 0.2) 

La biblioteca aggiunge anche alcuni altre utili UI caratteristiche nel tuo progetto - controlla il suo README su GitHub per maggiori dettagli.

Spero che aiuti!

2

Qui è rapido UIColor estensione che potrebbe risultare utile:

extension UIColor { 

    func modified(withAdditionalHue hue: CGFloat, additionalSaturation: CGFloat, additionalBrightness: CGFloat) -> UIColor { 

     var currentHue: CGFloat = 0.0 
     var currentSaturation: CGFloat = 0.0 
     var currentBrigthness: CGFloat = 0.0 
     var currentAlpha: CGFloat = 0.0 

     if self.getHue(&currentHue, saturation: &currentSaturation, brightness: &currentBrigthness, alpha: &currentAlpha){ 
      return UIColor(hue: currentHue + hue, 
          saturation: currentSaturation + additionalSaturation, 
          brightness: currentBrigthness + additionalBrightness, 
          alpha: currentAlpha) 
     } else { 
      return self 
     } 
    } 
}