Changeset 67225 in spip-zone


Ignore:
Timestamp:
Oct 28, 2012, 4:08:26 PM (7 years ago)
Author:
tcharlss@…
Message:

Ajout de quelques modes de fusion au filtre image_masque, tirés des formules indiquées sur wikipedia : https://en.wikipedia.org/wiki/Blend_modes
Même nomenclature et mêmes résultats que ceux de GIMP.

  • ecran: effet inverse de 'produit' -> l'image resultante est plus claire
  • superposer: combine les modes 'produit' et 'ecran' -> les parties claires sont eclaircies, les parties sombres assombries.
  • lumiere_dure: equivalent a 'superposer', sauf que l'image du bas et du haut sont inversees.
  • teinte: utilise la teinte du masque
  • saturation: utilise la saturation du masque
  • valeur: utilise la valeur du masque

Comme ce n'est pas un ajout majeur, on incrémente que le dernier chiffre pour la version.

Location:
_core_/branches/spip-3.0/plugins/filtres_images
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _core_/branches/spip-3.0/plugins/filtres_images/filtres/images_transforme.php

    r62390 r67225  
    1212/**
    1313 * Toutes les fonctions image_xx de ce fichier :
    14  *      - prennent une image en entree
     14 *  - prennent une image en entree
    1515 *  - fournissent une image en sortie
    1616 *  - sont chainables les unes derrieres les autres dans toutes les combinaisons possibles
     
    505505        //
    506506        // $pos est une variable libre, qui permet de passer left=..., right=..., bottom=..., top=...
    507         // dans ce cas, le pasque est place a ces positions sur l'image d'origine,
     507        // dans ce cas, le masque est place a ces positions sur l'image d'origine,
    508508        // et evidemment cette image d'origine n'est pas redimensionnee
    509509        //
    510510        // Positionnement horizontal: text-align=left, right, center
    511         // Positionnement vertical : vertical-align: top, bottom, middle
     511        // Positionnement vertical : vertical-align=top, bottom, middle
    512512        // (les positionnements left, right, top, left sont relativement inutiles, mais coherence avec CSS)
    513513        //
    514         // Choix du mode de fusion: mode=masque, normal, eclaircir, obscurcir, produit, difference
     514        // Choix du mode de fusion: mode=masque, normal, eclaircir, obscurcir, produit, difference, ecran, superposer, lumiere_dure, teinte, saturation, valeur
     515        // https://en.wikipedia.org/wiki/Blend_modes
    515516        // masque: mode par defaut
    516517        // normal: place la nouvelle image par dessus l'ancienne
     
    519520        // produit: multiplie par le masque (points noirs rendent l'image noire, points blancs ne changent rien)
    520521        // difference: remplit avec l'ecart entre les couleurs d'origine et du masque
     522        // ecran: effet inverse de 'produit' -> l'image resultante est plus claire
     523        // superposer: combine les modes 'produit' et 'ecran' -> les parties claires sont eclaircies, les parties sombres assombries.
     524        // lumiere_dure: equivalent a 'superposer', sauf que l'image du bas et du haut sont inversees.
     525        // teinte: utilise la teinte du masque
     526        // saturation: utilise la saturation du masque
     527        // valeur: utilise la valeur du masque
    521528
    522529        $mode = "masque";
    523 
    524530
    525531        $numargs = func_num_args();
     
    550556        $x_i = $image["largeur"];
    551557        $y_i = $image["hauteur"];
    552        
     558
    553559        $im = $image["fichier"];
    554560        $dest = $image["fichier_dest"];
    555        
     561
    556562        $creer = $image["creer"];
    557563
     
    570576                $x_m = $mask["largeur"];
    571577                $y_m = $mask["hauteur"];
    572        
     578
    573579                $im2 = $mask["fonction_imagecreatefrom"]($masque);
    574580                if ($mask["format_source"] == "gif" AND function_exists('ImageCopyResampled')) {
     
    584590                        $im2 = $im2_;
    585591                }
    586                
     592
    587593                if ($placer) {
    588594                        // On fabriquer une version "agrandie" du masque,
     
    590596                        // et on "installe" le masque dans cette image
    591597                        // ainsi: aucun redimensionnement
    592                        
     598
    593599                        $dx = 0;
    594600                        $dy = 0;
     
    634640                                }
    635641                        }
    636                        
    637                        
     642
     643
    638644                        $im3 = imagecreatetruecolor($x_i, $y_i);
    639645                        @imagealphablending($im3, false);
     
    643649                        imagefill ($im3, 0, 0, $color_t);
    644650
    645                        
    646651
    647652                        imagecopy ( $im3, $im2, $dx, $dy, 0, 0, $x_m, $y_m);
     
    651656                        @imagealphablending($im2, false);
    652657                        @imagesavealpha($im2,true);
    653                        
    654                        
    655                        
     658
    656659                        imagecopy ( $im2, $im3, 0, 0, 0, 0, $x_i, $y_i);
    657660                        imagedestroy($im3);
     
    659662                        $y_m = $y_i;
    660663                }
    661                
    662        
     664
     665
    663666                $rapport = $x_i / $x_m;
    664667                if (($y_i / $y_m) < $rapport ) {
     
    668671                $x_d = ceil($x_i / $rapport);
    669672                $y_d = ceil($y_i / $rapport);
    670                
     673
    671674
    672675                if ($x_i < $x_m OR $y_i < $y_m) {
     
    686689                if (!is_array($nouveau)) return("");
    687690                $im_n = $nouveau["fichier"];
    688                
    689        
     691
     692
    690693                $im = $nouveau["fonction_imagecreatefrom"]($im_n);
    691694                imagepalettetotruecolor($im);
     
    709712
    710713
     714                // calcul couleurs de chaque pixel selon les modes de fusion
    711715                for ($x = 0; $x < $x_dest; $x++) {
    712716                        for ($y=0; $y < $y_dest; $y++) {
    713                                 $rgb = ImageColorAt($im2, $x, $y);
     717                                $rgb = ImageColorAt($im2, $x, $y); // image au dessus
    714718                                $a = ($rgb >> 24) & 0xFF;
    715719                                $r = ($rgb >> 16) & 0xFF;
    716720                                $g = ($rgb >> 8) & 0xFF;
    717721                                $b = $rgb & 0xFF;
    718                                
    719 
    720                                 $rgb2 = ImageColorAt($im, $x+$x_dec, $y+$y_dec);
     722
     723                                $rgb2 = ImageColorAt($im, $x+$x_dec, $y+$y_dec); // image en dessous
    721724                                $a2 = ($rgb2 >> 24) & 0xFF;
    722725                                $r2 = ($rgb2 >> 16) & 0xFF;
    723726                                $g2 = ($rgb2 >> 8) & 0xFF;
    724727                                $b2 = $rgb2 & 0xFF;
    725                                
    726                                
    727                                
     728
    728729                                if ($mode == "normal") {
    729730                                        $v = (127 - $a) / 127;
     
    738739                                                        $g_ = $g2;
    739740                                                        $b_ = $b2;
    740                                                 } else if ($v2 ==0) {
     741                                                } else if ($v2 == 0) {
    741742                                                        $r_ = $r;
    742743                                                        $g_ = $g;
     
    753754                                        }
    754755                                        $a_ = min($a,$a2);
    755                                 } elseif ($mode == "produit" OR $mode == "difference") {                                       
    756 
     756
     757                                } elseif (in_array($mode, array("produit","difference","superposer","lumiere_dure","ecran"))) {
    757758                                        if ($mode == "produit") {
    758759                                                $r = ($r/255) * $r2;
    759760                                                $g = ($g/255) * $g2;
    760761                                                $b = ($b/255) * $b2;
    761                                         } else if ($mode == "difference") {
     762                                        } elseif ($mode == "difference") {
    762763                                                $r = abs($r-$r2);
    763764                                                $g = abs($g-$g2);
    764                                                 $b = abs($b-$b2);                               
     765                                                $b = abs($b-$b2);
     766                                        } elseif ($mode == "superposer") {
     767                                                $r = ($r2 < 128) ? 2 * $r * $r2 / 255 : 255 - (2 * (255 - $r) * (255 - $r2) / 255);
     768                                                $g = ($g2 < 128) ? 2 * $g * $g2 / 255 : 255 - (2 * (255 - $g) * (255 - $g2) / 255);
     769                                                $b = ($b2 < 128) ? 2 * $b * $b2 / 255 : 255 - (2 * (255 - $b) * (255 - $b2) / 255);
     770                                        } elseif ($mode == "lumiere_dure") {
     771                                                $r = ($r < 128) ? 2 * $r * $r2 / 255 : 255 - (2 * (255 - $r2) * (255 - $r) / 255);
     772                                                $g = ($g < 128) ? 2 * $g * $g2 / 255 : 255 - (2 * (255 - $g2) * (255 - $g) / 255);
     773                                                $b = ($b < 128) ? 2 * $b * $b2 / 255 : 255 - (2 * (255 - $b2) * (255 - $b) / 255);
     774                                        } elseif ($mode == "ecran") {
     775                                                $r = 255 - (((255 - $r) * (255 - $r2)) / 255);
     776                                                $g = 255 - (((255 - $g) * (255 - $g2)) / 255);
     777                                                $b = 255 - (((255 - $b) * (255 - $b2)) / 255);
    765778                                        }
    766 
    767779                                        $r = max(0, min($r, 255));
    768780                                        $g = max(0, min($g, 255));
    769781                                        $b = max(0, min($b, 255));
    770782
     783                                        // melange en fonction de la transparence du masque
    771784                                        $v = (127 - $a) / 127;
    772                                         if ($v == 1) {
     785                                        if ($v == 1) { // melange complet
    773786                                                $r_ = $r;
    774787                                                $g_ = $g;
     
    776789                                        } else {
    777790                                                $v2 = (127 - $a2) / 127;
    778                                                 if ($v+$v2 == 0) {
     791                                                if ($v+$v2 == 0) { // ??
    779792                                                        $r_ = $r2;
    780793                                                        $g_ = $g2;
    781794                                                        $b_ = $b2;
    782                                                 } else {
     795                                                } else { // pas de melange (transparence du masque)
    783796                                                        $r_ = $r + (($r2 - $r) * $v2 * (1 - $v));
    784797                                                        $g_ = $g + (($g2 - $g) * $v2 * (1 - $v));
     
    786799                                                }
    787800                                        }
    788 
    789 
    790801                                        $a_ = $a2;
     802
    791803                                } elseif ($mode == "eclaircir" OR $mode == "obscurcir") {
    792804                                        $v = (127 - $a) / 127;
     
    814826                                                $r_ = min ($r_, $r2);
    815827                                                $g_ = min ($g_, $g2);
    816                                                 $b_ = min ($b_, $b2);                                   
     828                                                $b_ = min ($b_, $b2);
    817829                                        }
    818                                        
    819830                                        $a_ = min($a,$a2);
     831
     832                                } elseif (in_array($mode, array("teinte","saturation","valeur"))) {
     833                                        include_spip("filtres/images_lib");
     834                                        $hsv = _couleur_rgb2hsv($r, $g, $b); // image au dessus
     835                                        $h = $hsv["h"];
     836                                        $s = $hsv["s"];
     837                                        $v = $hsv["v"];
     838                                        $hsv2 = _couleur_rgb2hsv($r2, $g2, $b2); // image en dessous
     839                                        $h2 = $hsv2["h"];
     840                                        $s2 = $hsv2["s"];
     841                                        $v2 = $hsv2["v"];
     842                                        switch ($mode)  {
     843                                                case "teinte";
     844                                                        $rgb3 = _couleur_hsv2rgb($h, $s2, $v2);
     845                                                        break;
     846                                                case "saturation";
     847                                                        $rgb3 = _couleur_hsv2rgb($h2, $s, $v2);
     848                                                        break;
     849                                                case "valeur";
     850                                                        $rgb3 = _couleur_hsv2rgb($h2, $s2, $v);
     851                                                        break;
     852                                        }
     853                                        $r = $rgb3["r"];
     854                                        $g = $rgb3["g"];
     855                                        $b = $rgb3["b"];
     856
     857                                        // melange en fonction de la transparence du masque
     858                                        $v = (127 - $a) / 127;
     859                                        if ($v == 1) { // melange complet
     860                                                $r_ = $r;
     861                                                $g_ = $g;
     862                                                $b_ = $b;
     863                                        } else {
     864                                                $v2 = (127 - $a2) / 127;
     865                                                if ($v+$v2 == 0) { // ??
     866                                                        $r_ = $r2;
     867                                                        $g_ = $g2;
     868                                                        $b_ = $b2;
     869                                                } else { // pas de melange (transparence du masque)
     870                                                        $r_ = $r + (($r2 - $r) * $v2 * (1 - $v));
     871                                                        $g_ = $g + (($g2 - $g) * $v2 * (1 - $v));
     872                                                        $b_ = $b + (($b2 - $b) * $v2 * (1 - $v));
     873                                                }
     874                                        }
     875                                        $a_ = $a2;
     876
    820877                                } else {
    821878                                        $r_ = $r2 + 1 * ($r - 127);
     
    825882                                        $b_ = $b2 + 1 * ($b - 127);
    826883                                        $b_ = max(0, min($b_, 255));
    827                                        
    828884                                        $a_ = $a + $a2 - round($a*$a2/127);
    829885                                }
    830886
    831887                                $color = ImageColorAllocateAlpha( $im_, $r_, $g_, $b_ , $a_ );
    832                                 imagesetpixel ($im_, $x, $y, $color);                   
     888                                imagesetpixel ($im_, $x, $y, $color);
    833889                        }
    834890                }
  • _core_/branches/spip-3.0/plugins/filtres_images/paquet.xml

    r67127 r67225  
    22        prefix="images"
    33        categorie="multimedia"
    4         version="1.1.2"
     4        version="1.1.3"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.0.*]"
Note: See TracChangeset for help on using the changeset viewer.