NSColor problème de conversion

RocouRocou Membre
23:09 modifié dans API AppKit #1
Bonjour,

Je réalise des conversions NSString hexadécimal en NSColor et inversement.
Les méthodes de conversion ont été écrites avec l'aide des intervenants du forum et je les en remercie.

Néanmoins, dans certains cas, j'obtiens l'erreur suivante:
*** -blueComponent not defined for the NSColor NSCustomColorSpace RVB générique colorspace 1 0 0 1; need to first convert colorspace.

Voici les méthodes:

Pour convertir une chaà®ne hexa (du style "&cFF0000") en NSColor:
-(NSColor*)setColorBenne:(NSString*)hexcol<br />{<br />	<br />	CGFloat c1,c2,c3;<br />	c1=strtol([[hexcol substringWithRange:NSMakeRange(2, 2)] UTF8String],NULL,16);<br />	c2=strtol([[hexcol substringWithRange:NSMakeRange(4, 2)] UTF8String],NULL,16);<br />	c3=strtol([[hexcol substringWithRange:NSMakeRange(6, 2)] UTF8String],NULL,16);<br />	<br />	<br />	return [NSColor colorWithDeviceRed:c1/255.0 green:c2/255.0 blue:c3/255.0 alpha:1.0];<br />	<br />}<br />



Pour convertir une NSColor en chaà®ne hexa:
-(NSString*)hexValueForColor:(NSColor*)aColor<br />{<br />	NSColor* rgbCol = [aColor colorUsingColorSpace:[NSColorSpace genericRGBColorSpace]];<br />	return [NSString stringWithFormat: @&quot;%02X%02X%02X&quot;,<br />			(unsigned char)([rgbCol redComponent]*255),<br />			(unsigned char)([rgbCol greenComponent]*255),<br />			(unsigned char)([rgbCol blueComponent]*255)<br />			];<br />}<br />


J'ai un NSColorWell. Je l'initialise avec un [monNSColorWell setColor:maCouleur] puis je récupère la couleur avec [monNSColorWell Color];

L'erreur apparaà®t dans le cas suivant:
1- Je récupère une NSString contenant la valeur de la couleur en hexa
2- je transforme cette chaine grâce à  la méthode setColorBenne
3- j'initialise monNSColorWell avec la NSColor issue de 2 (ça fonctionne très bien)
4- je récupère la couleur avec [monNSColorWell Color] ça plante ici!

Par contre, si à  la place des point 1,2 et 3 j'utilise le NSColorWell pour choisir une couleur, il n'y pas d'erreur.

Réponses

  • mpergandmpergand Membre
    23:09 modifié #2
    Salut,

    J'utilise une catégorie sur NSColor:
    @implementation&nbsp; NSColor (CTColor)<br /><br /><br />+(NSColor*)	colorWithString:(NSString*) colorStr<br />{<br />	NSArray* components=[colorStr componentsSeparatedByString:@&quot; &quot;];<br />	float c[4]={1,1,1,1};<br />	int i;<br />	<br />	for(i=0;i&lt;[components count];i++)<br />		c[i]=[[components objectAtIndex:i] floatValue];<br />	<br />	return [NSColor colorWithCalibratedRed:c[0] green:c[1] blue:c[2] alpha:c[3]];&nbsp; <br />}<br /><br /><br />-(NSString*) stringRepresentation<br />{<br />	NSColor* color=[self shadowWithLevel:0.0];	// pour s&#39;assurer que la couleur possède bien des components<br />	float r,g,b,a;<br />	<br />	[color getRed:&amp;r green:&amp;g blue:&amp;b alpha:&amp;a];<br />	<br />	return [NSString stringWithFormat:@&quot;%.3f %.3f %.3f %.3f&quot;,r,g,b,a];<br />}<br /><br />@end
    


    J'ai constaté depuis longtemps, que certaines couleurs ne sont pas décomposables directement, d'où le:
    NSColor* color=[self shadowWithLevel:0.0]; // pour s'assurer que la couleur possède bien des components

    Mais, j'ai jamais vraiment compris pourquoi ...

    Ton problème est peut-être le même ... ou pas  ???
  • RocouRocou Membre
    23:09 modifié #3
    dans 1247820910:

    J'ai constaté depuis longtemps, que certaines couleurs ne sont pas décomposables directement, d'où le:
    NSColor* color=[self shadowWithLevel:0.0]; // pour s'assurer que la couleur possède bien des components

    Mais, j'ai jamais vraiment compris pourquoi ...

    Ton problème est peut-être le même ... ou pas  ???

    Oi, c'était ça, merci beaucoup. Je n'aurais jamais pu trouver ça tout seul.  B)
  • AliGatorAliGator Membre, Modérateur
    23:09 modifié #4
    Certaines couleurs n'appartiennent tout bonnement pas à  l'espace colorimétrique RGB, ou ne sont pas convertible de leur espace colorimétrique d'origine vers l'espace RGB... C'est en général plutôt rare, donc ça m'étonne que vous ayez ce cas-là  de non-possibilité de décomposition... mais bon, ça existe.
  • fouffouf Membre
    23:09 modifié #5
    Il faut utiliser les methodes colorUsingColorSpace:, colorUsingColorSpaceName: ou colorUsingColorSpaceName:device: pour transformer les couleurs dans le bon espace. C'est plus propre que l'utilisation de shadowWithLevel:

    Si je me souviens bien, whiteColor, blackColor ou grayColor retournent une couleur dans le
    [NSColorSpace genericGrayColorSpace] et greenColor, ... dans le [NSColorSpace genericRGBColorSpace]
  • schlumschlum Membre
    23:09 modifié #6
    Ben dans le code c'est bien ce qu'il fait non ?  ???

    NSColor* rgbCol = [aColor colorUsingColorSpace:[NSColorSpace genericRGBColorSpace]];
    
  • fouffouf Membre
    23:09 modifié #7
    dans 1247851811:

    Ben dans le code c'est bien ce qu'il fait non ?  ???

    NSColor* rgbCol = [aColor colorUsingColorSpace:[NSColorSpace genericRGBColorSpace]];
    



    Pas dans le code de mpergand. Si ce que mpergand cherche a faire, c'est récupérer une couleur RGB, utiliser les méthodes que je donne est peut-être plus adapté.
  • schlumschlum Membre
    23:09 modifié #8
    Ah, le code de mpergand je ne sais pas...
    Mais Rocou l'utilise et il a quand même des problèmes apparemment  ???
  • mpergandmpergand Membre
    23:09 modifié #9
    Mon truc fait un peu bidouille, mais ça marche  :)

    Sinon on en parle ici:
    http://forum.macbidouille.com/index.php?showtopic=188646
Connectez-vous ou Inscrivez-vous pour répondre.