Core Video et Transparence

anomeanome Membre
septembre 2011 modifié dans API AppKit #1
Bonjour,

Je voudrais utiliser des CIFilter de type BlendMode (ex: CISourceOverCompositing), mais malheureusement ces derniers modifient la transparence de mes vidéos.
Voici un exemple de superposition de 2 CVImageBuffer (issus donc de vidéos) :

Sans CIFilter / OK
good.png

Avec le CIFilter "CISourceOverCompositing" / Problème : la transparence est mauvaise
bad.png

Comment faire pour que le résultat avec CIFilter ressemble à  la première image ?
Merci pour votre aide et bonne journée.



Voici le code de test que j'utilise :
<br />&nbsp; &nbsp; glEnable( GL_BLEND );<br />&nbsp; &nbsp; glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if(withCiFilter)&nbsp; // Mauvaise transparence<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; CIImage *ciScreenImage = nil;<br />&nbsp; &nbsp; &nbsp; &nbsp; if (NULL != frame1) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CIImage *image = [[CIImage imageWithCVImageBuffer:frame1] retain];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ciScreenImage = image;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [image release];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (NULL != frame2) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CIImage *image = [[CIImage imageWithCVImageBuffer:frame2] retain];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CIFilter *filter = [CIFilter filterWithName:@&quot;CISourceOverCompositing&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [filter setValue:image forKey:@&quot;inputImage&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [filter setValue:ciScreenImage forKey:@&quot;inputBackgroundImage&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ciScreenImage = [filter valueForKey:@&quot;outputImage&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [image release];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; [ciContext drawImage:ciScreenImage atPoint:CGPointZero fromRect:[ciScreenImage extent]];<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; else&nbsp; // Transparence OK<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; if (NULL != frame1) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CIImage *image = [[CIImage imageWithCVImageBuffer:frame1] retain];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [ciContext drawImage:image atPoint:CGPointZero fromRect:[image extent]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [image release];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; if (NULL != frame2) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CIImage *image = [[CIImage imageWithCVImageBuffer:frame2] retain];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [ciContext drawImage:image atPoint:CGPointZero fromRect:[image extent]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [image release];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />

Réponses

  • tabliertablier Membre
    21:41 modifié #2
    Les transparences, c'est pas mon truc, mais quelle est exactement ta question?
  • anomeanome Membre
    21:41 modifié #3
    dans 1315819246:

    Les transparences, c'est pas mon truc, mais quelle est exactement ta question?

    Merci, je viens de modifier mon post. Ma question est la suivante : comment faire pour que le résultat avec CIFilter ressemble à  la première image ?
  • tabliertablier Membre
    21:41 modifié #4
    La question est claire, mais je m'avoue incompétent sur ce sujet, même après avoir regardé ton code et la documentation! Désolé.


  • HerveHerve Membre
    21:41 modifié #5
    Je vais essayer une réponse, excuse moi si cela n'aide pas.

    Ton code "qui marche" crée visiblement les objets à  dessiner les uns à  la suite des autres, et c'est bien puisque qu'ils seront dessinés ainsi dans cet ordre. Celui qui ne marche pas a deux "if" imbriqués. Je n'en vois pas l'utilité...

    Ceci dit, j'ai l'habitude de travailler avec des images fixes, pas des vidéos. A priori ce doit être le même principe...

    Ceci dit, je me sers de la démo "Core Image Fun House" pour tester les CIFilters, et je n'y vois pas dedans ceux que tu cites, mais bon...
  • anomeanome Membre
    21:41 modifié #6
    J'ai finalement écrit mes propres shaders OpenGL qui m'ont ensuite permis de créer des CIFilter, qui respectent la transparence des vidéos.
  • HerveHerve Membre
    21:41 modifié #7
    Super!  :)
Connectez-vous ou Inscrivez-vous pour répondre.