Comment récupérer le rgb d'une CIImage?

Bonjour,


 


Avant, j'utilisais NSBitmapImageRep pour travailler sur la couleur de l'image après traitement. Mais passé un certain volume de données, tant en taille fichier qu'en nombre d'images, ceci est contre-productif. Aussi j'essaie par les CIFilter, CIImage, etc.


 


Mon problème est  :


- comment récupérer les valeurs rgb d'une CIImage pour pouvoir écrire mon CIFilter? Après, je dérive une classe CIFilter, etc., je devrais y arriver, mais depuis ce matin, je bloque sur cette recup. du rgb.


 


Je ne trouve ni l'info ni du code source! J'ai bien vu ces CIVector, mais il me faut récupérer les valeurs de l'input avant d'envoyer l'output.


 


(Ma méthode avec NSBitmapImageRep marche très bien, mais elle ne travaille qu'avec le processeur principal. Si j'ai bien compris la doc, CIImage travaille aussi avec la carte graphique. Est-ce exact?????)


 


Merci par avance  :))


Réponses

  • CéroceCéroce Membre, Modérateur
    juillet 2015 modifié #2
    La doc de Core Image a deux parties concernant les CIFilters:

    - Subclassing CIFilter
    Explique comment combiner les CIFilters existants pour en créer de nouveaux.

    - Creating Custom Filters
    Explique comment écrire un CIKernel pour faire tes propres traitements.

    C'est la deuxième section qui t'intéresse " du moins, si tu es certain qu'aucun CIFIlter standard ne répond à  ton besoin*.
    Les CIKernel sont écrits dans un sous ensemble de GLSL (OpenGL Shading Language), je te laisse jeter un oe“il à  la doc. C'est un peu intimidant au début, mais tu verras que c'est assez logique et que la démarche est toujours la même.

    * il y a quand même beaucoup de filtres standard, qui répondent plutôt bien aux besoins courants.
  • Merci Céroce. J'aurais préféré me "contenter" d'une classe CIFilter plutôt que de me lancer dans un Bundle (façon audio-unit). Effectivement, les "kernel" semblent réservés aux bundles.


    J'ai essayé plusieurs filtres avec la démo "Core Image Fun House". Aucun ne me plaisait vraiment par rapport à  mon projet, mais je veux surtout "faire mumuse" avec le RGB comme je fais déjà  mumuse avec le son. Cela m'intéresse. J'ai déjà  fait "Harmony of Colors" avec l'image (pour l'instant sous MacOS), là  encore aucun filtre ne correspondait (et pour cause! à  part un ou deux peut-être?). Je souhaite continuer à  apprendre à  maà®triser les deux : l'image et le son.


  • CéroceCéroce Membre, Modérateur

    Merci Céroce. J'aurais préféré me "contenter" d'une classe CIFilter plutôt que de me lancer dans un Bundle (façon audio-unit). Effectivement, les "kernel" semblent réservés aux bundles.

    Je t'assure que non. C'est seulement nécessaire si tu veux partager les filtres entre les applis.
    Essaie de suivre l'exemple du Haze filter.
  • Merci Céroce,


     


    Effectivement, il est possible de créer une classe CIImage dans l'appli. Je suis dessus en ce moment. Cela avance lentement, mais surement...


  • Ai-je bien compris si je crée un fichier ".cikernel" dans lequel il y aura le code du filtre image en plus de ma classe CIImage qui va l'appeler? (Un peu comme dans l'audio on écrit la méthode audio dans un :



    static OSStatus myRenderCallback{
    //ma méthode audio
    }

    pas moyen sinon d'écrire le kernel en question...


  • CéroceCéroce Membre, Modérateur
    Non. Typiquement, on met le code du kernel dans un fichier texte, on le lit, et on passe la chaà®ne à  +[CIKernel kernelWithString:].

    Suis le tuto sur le Haze filter. Vraiment.
  • Merci Céroce,


     


    J'ai bien avancé. J'utilise pour le moment un des kernel de démo qui ne nécessite que le fichier source. D'après la doc, il faut bien mettre la terminaison "cikernel" pour que la méthode fonctionne :



    NSString *code = [NSString stringWithContentsOfFile: [bundle pathForResource: @KernelFiltre ofType: @cikernel]];

    Mon problème est maintenant que la méthode "outputImage" du filtre m'envoie une image trop grande! Elle semble être crée si j'en crois la description de ma console, mais une image de 309 par 500 pixels donne  en retours :



    NSCIImageRep 0x608000873700 Size={1.7976931348623157e+308, 1.7976931348623157e+308}//...

    soit une taille totalement délirante. Je passe par NSCIImageRep pour remettre en NSImage ma CIImage, est-ce la bonne solution? (C'est celle que j'utilise déjà  dans un précédent logiciel, où j'emploie les filtres d'usine) Où est le bug sinon? Pas moyen de le débusquer encore.


    Le code du kernel est validé, et reconnu par la classe CIImage. Le problème vient peut-être d'une non utilisation du "ROI" dont parle la doc. Je cherche encore, mais si vous avez une idée, ce sera très sympa!


  • Ne vous fatiguez pas, après une nuit de sommeil, j'ai trouvé : j'oubliais d'ajouter 



    , kCIApplyOptionDefinition, [src definition]

    à  la méthode du outputImage. Je ne sais pas ce que cela veut dire, mais ça marche!!


     


    Merci encore!


  • CéroceCéroce Membre, Modérateur

    D'après la doc, il faut bien mettre la terminaison "cikernel" pour que la méthode fonctionne

    Je n'en crois pas un mot. Le kernel s'initialise avec une string, alors il ne connaà®t même pas l'extension du fichier. En plus, tu peux tout à  fait mettre le code du kernel en dur dans ton code plutôt que dans un fichier texte.
  • Désolé Céroce, mais c'est ce qui est écrit dans la doc, c'est ce que j'ai fait, et cela marche impec. So???


     


    Merci encore en tous les cas.


Connectez-vous ou Inscrivez-vous pour répondre.