[Résolu] Additionner les couleurs de polygones superposés

Additionner les couleurs de polygones superposés [Résolu] - PHP - Programmation

Marsh Posté le 06-02-2024 à 17:56:42    

Bonjour,
Je trace plusieurs polygones remplis d'un couleur unie sur une image toute noire. Je voudrais que les pixels des zones de l'image où 2 voire plus de polygones qui se superposent (i.e. intersection entre 2 ou plus polygones) prennent la couleur résultant du "mélange" des couleurs de chaque polygone concerné.
Ex : si une zone correspond à l'intersection de 2 polygones dont l'un est dans la couleur rouge (255,0,0) et l'autre est bleu (0,0,255), les pixels de cette zone soient en violet (255,0,255).
 
Je cherche une fonction PHP qui ferait ça nativement, sinon, un algorithme.
 
Merci par avance pour votre aide :jap:


Message édité par rufo le 07-02-2024 à 17:57:42

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-02-2024 à 17:56:42   

Reply

Marsh Posté le 06-02-2024 à 18:15:15    

tu utilises une couleur avec de la transparence ?


---------------

Reply

Marsh Posté le 06-02-2024 à 18:30:33    

Je maitrises pas trop le sujet programmatiquement mais ça ressemble à certain mode de fusion de calque sur Photoshop.
 
Ça doit pouvoir se faire avec ImageMagick :
https://imagemagick.org/script/composite.php
https://www.w3.org/TR/2004/WD-SVG12 [...] ering.html


---------------
D3
Reply

Marsh Posté le 06-02-2024 à 20:13:24    

flo850 a écrit :

tu utilises une couleur avec de la transparence ?


Ca pourrait être envisagé. Mais j'ai peur d'avoir du mal à pouvoir calculer la couleur des pixels résultant de la superposition avec transparence.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-02-2024 à 20:19:06    

mechkurt a écrit :

Je maitrises pas trop le sujet programmatiquement mais ça ressemble à certain mode de fusion de calque sur Photoshop.
 
Ça doit pouvoir se faire avec ImageMagick :
https://imagemagick.org/script/composite.php
https://www.w3.org/TR/2004/WD-SVG12 [...] ering.html


Oui, c'est le principe des calques de fusion de Photoshop mais je voudrais pouvoir le faire avec PHP.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 07-02-2024 à 08:56:45    

https://www.w3.org/TR/2004/WD-SVG12 [...] mp-op-prop
https://imagemagick.org/Usage/compose/#plus
 
Faudra ptet partir d'un fond blanc par contre...


---------------
D3
Reply

Marsh Posté le 07-02-2024 à 09:16:50    

Avoir un fond blanc ou noir, c'est pas un souci. Par contre, il me faut un truc utilisable directement en PHP. Pas de lib ou outil additionnel, juste une fonction native PHP ou un algo que je puisse implémenter en PHP. Tout mon environnement de production est en PHP. Je dois faire avec ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 07-02-2024 à 10:02:00    

Pas moyen d'installer Imagick sur ton serveur ?
https://www.php.net/manual/fr/imagi [...] eimage.php
https://www.php.net/manual/fr/imagi [...] ompositeop
 
Ou en ligne de commande avec system();
 
Sinon y'a les algos sur la doc w3 svg 1.2 :

Citation :

All color components listed below refer to color component information pre-multiplied by the corresponding alpha value. The following identifiers have the attached meaning in the equations below:
 
      Sc  - The source element color value.
      Sa  - The source element alpha value.
      Dc  - The canvas color value prior to compositing.
      Da  - The canvas alpha value prior to compositing.
      Dc' - The canvas color value post compositing.
      Da' - The canvas alpha value post compositing.
 
plus
 
    The source is added to the destination and replaces the destination. This operator is useful for animating a dissolve between two images.
 
    f(Sc,Dc) = Sc + Dc
    X        = 1
    Y        = 1
    Z        = 1
 
    Dca' = Sca.Da + Dca.Sa + Sca.(1 - Da) + Dca.(1 - Sa)
         = Sca + Dca
    Da'  = Sa.Da + Da.Sa + Sa.(1 - Da) + Da.(1 - Sa)
         = Sa + Da


Mais perso ça ne m'aide pas... :o


---------------
D3
Reply

Marsh Posté le 07-02-2024 à 17:57:01    

C'est bon, j'ai trouvé un algo.
Je transforme chaque polygone rempli d'une couleur unie en segments horizontaux (ligne par ligne). C'est facile, j'ai un fond noir pour chaque image avec un seul polygone tracé dessus en une seule couleur. Donc, pour chaque ligne, je repère à quel $x je passe d'une pixel noir à un pixel de couleur puis quand je repasse d'un pixel de couleur à du noir. Ca me fait un segment. Je continue jusqu'à la fin de la ligne, je passe à la ligne suivante et ainsi de suite.
 
A la fin, je trace chaque segment sur l'image finale via l'algo de Bresenham. Pour chaque pixel à afficher du segment, je calcule la couleur qui est : couleur du pixel déjà présent sur l'image + couleur de mon polygone.
 
Et hop, à la fin, j'ai mon image bien comme je veux :) L'intersection du polygone rouge avec le polygone vert me donne bien du jaune.
 
Edit : au passage, je suis tombé sur cet article plutôt intéressant concernant l'intersection de polygones : https://www.gorillasun.de/blog/an-a [...] rsections/


Message édité par rufo le 07-02-2024 à 18:06:22

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed