[Résolu] Récupérer le content filter d'une NSImage dans le code

berfisberfis Membre
mai 2013 modifié dans API AppKit #1

Bonjour,


J'ai utilisé pour la première fois le "Content Filter" sur une NSImage dans IB. J'ai paramétré le filtre "False Color". Le problème que j'ai maintenant, c'est d'y accéder depuis le code (j'aimerais changer dynamiquement la couleur de ce filtre). Comment faire?


D'avance merci si quelqu'un peut m'indiquer une solution ou à  défaut une piste...


B.


Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur
    mars 2013 modifié #2
    Non, pas sur NSImage, mais sur NSImageView.

    Voir - [UIView contentFilters]. (Il s'agit d'une instance de CIFilter).
  • berfisberfis Membre
    mars 2013 modifié #3
    Merci Ceroce...



    J'en suis là :



    [[[myWindow [color=#90382a][i]imageView[/i][/color]][color=#933a2c][i]contentFilters[/i][/color]][[color=#009dbc]0[/color]][color=#933a2c][i]setValue[/i][/color]: theColor [color=#933a2c][i]forKey[/i][/color]:[color=#1b9447]@"inputColor0"[/color]];
    


    Le problème c'est que j'arrive à  définir la couleur au lancement de l'application mais plus par la suite (alors qu'il s'agit de la même instruction). Une idée?
  • CéroceCéroce Membre, Modérateur


    CIFalseColor



    Maps luminance to a color ramp of two colors.



    Parameters

    inputImage

    A CIImage object whose display name is Image. inputColor0

    A CIColor object whose display name is Color 1. inputColor1

    A CIColor object whose display name is Color 2.





    theColor est-elle bien une CIColor ?
  • Non, c'est une NSColor. Je les croyais interchangeables, elles ne le sont pas? Je dois transtyper?
  • AliGatorAliGator Membre, Modérateur
    Ah non, NSColor (UIColor sur iOS), CGColor et CIColor sont toutes des classes différentes, certes qui représentent toutes les 3 des couleurs, mais pas pour les mêmes frameworks et dans les mêmes contextes et donc pas dans les mêmes conditions.

    Le premier est la représentation Cocoa Object, le 2e est pour CoreGraphics et donc une structure plutôt atomique, et finalement le type le plus bas niveau, et le dernier est pour CoreImage pour coller aux traitements faits par les filtres et l'accélération matérielle.



    La classe CIColor a un constructeur pour créer une CIColor à  partir d'un CGColor.

    La classe NSColor a une méthode pour récupérer sa représentation équivalente en CGColor

    Donc avec tout ça tu peux t'en sortir très facilement.
  • Bon, avec ça:






    [color=#933A2C][font=Menlo][size=3]<br />
    [color=#000000]    [[[myWindow [/color][color=#90382a][i]imageView[/i][/color][color=#000000]][/color][i]contentFilters[/i][color=#000000]][0] [/color][i]setValue[/i][color=#000000]: [[[/color][color=#69281c][b]CIColor[/b][/color][color=#000000] [/color][i]alloc[/i][color=#000000]][/color][i]initWithColor[/i][color=#000000]:theColor] [/color][i]forKey[/i][color=#000000]:[/color][color=#1b9447]@&quot;inputColor0&quot;[/color][color=#000000]];[/color][/size][/font][/color]<br />
    <br />
    




    ca ne marche toujours pas.

    Un log avant et après cette instruction montre que le filtre a bien reçu la nouvelle valeur, mais elle ne s'actualise pas dans la méthode drawRect, pourtant appelée tous les dixièmes de seconde (Note: si j'enregistre la couleur dans les préférences, l'app redémarre avec la valeur modifiée, pourtant...)
  • Finalement je m'en suis sorti comme ça:




    [font=Menlo][size=3]<br />
            [color=#69281c][b]CALayer[/b][/color] *layer = [[myWindow [color=#90382a][i]imageView[/i][/color]] [color=#933a2c][i]layer[/i][/color]];[/size][/font][font=Menlo][size=3]<br />
            [color=#69281c][b]CIFilter[/b][/color] *filter = [[color=#69281c][b]CIFilter[/b][/color] [color=#933a2c][i]filterWithName[/i][/color]:[color=#1b9447]@&quot;CIFalseColor&quot;[/color]];[/size][/font][font=Menlo][size=3]<br />
            [filter [color=#933a2c][i]setDefaults[/i][/color]];[/size][/font][font=Menlo][size=3]<br />
            [filter [color=#933a2c][i]setValue[/i][/color]:[[[color=#69281c][b]CIColor[/b][/color] [color=#933a2c][i]alloc[/i][/color]][color=#933a2c][i]initWithColor[/i][/color]:theColor] [color=#933a2c][i]forKey[/i][/color]:[color=#1b9447]@&quot;inputColor0&quot;[/color]];[/size][/font][font=Menlo][size=3]<br />
            [layer [color=#933a2c][i]setFilters[/i][/color]:[color=#009dbc]@[[/color]filter[color=#009dbc]][/color]];[/size][/font]<br />
    <br />
    


    Merci du coup de main !
Connectez-vous ou Inscrivez-vous pour répondre.