"Colorisation" d'une image

DrakenDraken Membre
23:53 modifié dans API UIKit #1
Le SDK XNA pour Pc et Xbox 360 donne la possibilité de "teinter" les images à  l'affichage. C'est très pratique pour les jeux.

Par exemple on peut "teindre" en rouge un personnage touché par un projectile, en vert s'il est empoisonné, en bleu sous l'effet d'un sort, etc..

Savez-vous s'il est possible de faire la même chose facilement avec Core Graphics ? Dans le genre:

<br />// Pseudo code<br />draw (image, position, couleurDeTeinte)<br />


Réponses

  • AliGatorAliGator Membre, Modérateur
    juin 2009 modifié #2
    Sur Mac tu peux utiliser CoreImage et les CIFilters pour faire ça, ça se fait tout seul... par contre pour iPhone les CIFilters ne sont pas dispos.

    Mais tu peux utiliser CoreGraphics pour dessiner ton image à  coloriser, puis dessiner par dessus un rectangle de la couleur de "colorisation", en ayant mis un CGBlendMode à  "kCGBlendModeHue" juste avant pour régler le mode de compositing pour faire ce que tu veux.

    Voir ici pour les différents BlendModes et ce que donne entre autres les "Hue Blend Mode"

    En effet, ce mode permet d'utiliser la "Hue" (teinte) de l'image source tout en gardant la luminosité (luminance) et saturation des pixels de l'image utilisée comme "background" de ton blending.
    [tt]kCGBlendModeHue[/tt]
      Uses the luminance and saturation values of the background with the hue of the source image.

    source


    Donc pour résumer ça devrait donner un truc ressemblant à  ça :
    - CGContextDrawImage(ctx,imageAColoriser,rect)
    - CGContextSaveGState(ctx)
    - CGContextSetBlendMode(ctx,kCGBlendModeHue)
    - CGContextSetFillColor(ctx,couleurDeColorisation)
    - CGContextFillRect(ctx,rect)
    - CGContextRestoreGState(ctx)
  • DrakenDraken Membre
    23:53 modifié #3
    Merci, cela parait très intéressant comme système. Je vais tester ça.





  • DrakenDraken Membre
    juin 2009 modifié #4
    En y réfléchissant, est-ce que ta technique fonctionne avec une image contenant une couche alpha ?

    Les bestioles des jeux sont des sprites dessinés avec une couche alpha, de manière à  superposer avec le décor du fond. Si j'applique un opérateur de colorisation rectangulaire sur mon image, il vas aussi agir sur le décor présent dans les "vides" du sprite (l'espace entre les jambes par exemple). Pas top graphiquement..

    Pour éviter, il faudrais que la "colorisation" d'une image se fasse en tenant compte de sa couche alpha.

  • AliGatorAliGator Membre, Modérateur
    23:53 modifié #5
    Je sais pas, à  tester en fait. Je pense que oui mais bon.

    Mais sinon tu utilises la couche alpha de ton sprite comme masque... Voir sans doute de ce côté
  • DrakenDraken Membre
    23:53 modifié #6
    Merci, c'est fou ce que l'on peut trouver dans la boite à  outil de Core Graphics.


  • DrakenDraken Membre
    23:53 modifié #7
    La doc d'Apple semble préconiser kCGBlendModeColor pour "teinter" une image.


    kCGBlendModeColor
    Uses the luminance values of the background with the hue and saturation values of the source image. This mode preserves the gray levels in the image. You can use this mode to color monochrome images or to tint color images.


  • AliGatorAliGator Membre, Modérateur
    23:53 modifié #8
    Ahoui tiens je l'avais zappé lui qd j'ai regardé les différents "effets"/"rendus" des blendmodes dans mon lien ;) bien vu 
  • schlumschlum Membre
    23:53 modifié #9
    dans 1244208975:

    En y réfléchissant, est-ce que ta technique fonctionne avec une image contenant une couche alpha ?

    Les bestioles des jeux sont des sprites dessinés avec une couche alpha, de manière à  superposer avec le décor du fond. Si j'applique un opérateur de colorisation rectangulaire sur mon image, il vas aussi agir sur le décor présent dans les "vides" du sprite (l'espace entre les jambes par exemple). Pas top graphiquement..

    Pour éviter, il faudrais que la "colorisation" d'une image se fasse en tenant compte de sa couche alpha.


    Il y a tout un tas de modes de composition... à  voir pour sélectionner celui qui te correspond.
Connectez-vous ou Inscrivez-vous pour répondre.