Position actuelle: Accueil> Derniers articles> ImageLeLayereffect peut-il être utilisé en mode hybride? L'ensemble du processus d'effet de mélange d'images est réalisé

ImageLeLayereffect peut-il être utilisé en mode hybride? L'ensemble du processus d'effet de mélange d'images est réalisé

gitbox 2025-06-15

Le mode mélange est une technique courante pendant le traitement d'image qui permet de mélanger deux images en fonction de formules mathématiques spécifiques pour produire divers effets visuels. Dans PHP, la bibliothèque GD est le principal outil de traitement d'image, et ImageLayEreffect () est l'une des fonctions utilisées pour contrôler les effets de couche. Alors, ImageLayEreffect () est-il compétent pour la mise en œuvre du mode mixte? Cet article explorera les capacités de cette fonction en profondeur et fournira une solution complète pour obtenir des effets de mélange d'images.

1. Comprendre ImageleLayeRffect ()

IMAMELAYEREFFECT () est une fonction dans la bibliothèque PHP GD. Sa fonction consiste à définir le mode de fusion de couche et à affecter les opérations de copie d'image ou de dessin ultérieures. La syntaxe est la suivante:

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">imagelayereffect</span></span><span>(GdImage </span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$effect</span></span><span>);
</span></span>

Les valeurs d'effet couramment utilisées comprennent:

  • IMG_EFFECT_REPLACE : comportement par défaut, remplacez directement les pixels.

  • IMG_EFFECT_ALPHABLEND : Mélange alpha standard.

  • IMG_EFFECT_NORMAL : Identique à ci-dessus.

  • IMG_EFFECT_OVERLAY : Effectuez le mélange de superposition.

  • IMG_EFFECT_MULTIPLY : Effectuez le mélange de multiplication.

  • IMG_EFFECT_MERGEGRAY : Effectue la fusion de gris.

Il convient de noter que les deux options IMG_EFFECT_OVERLAY et IMG_EFFECT_Multiply ne sont pas prises en charge par toutes les versions PHP, et elles ne sont pas implémentées ou invalides dans les versions plus anciennes.

2. Les limites de l'imageLayereffect

Bien que IMAMELAYEREFFECT () fournit certains modes hybrides prédéfinis, sa flexibilité et sa variété sont beaucoup moins flexibles et bien sûr en tant que logiciels d'image professionnels ou outils comme ImageMagick. Plus important encore, il ne fonctionne que sur l'opération de copie d'image suivante, comme l'utilisation de fonctions telles que ImageCopy () , ImageCopymerge () , etc. Il n'affecte pas les données de pixels existantes, et il ne prend pas en charge les formules personnalisées en mode de mélange arbitraire.

Par conséquent, si vous avez besoin d'implémenter des modes de mélange plus complexes ou personnalisés tels que "Soft Light", "Color Filter", "Deepinging Linear" dans Photoshop, vous devez le faire par calcul manuel de pixel par pixel.

3. Implémentation manuelle du mode hybride: Fonctionnement au niveau des pixels PHP

Prenant «multiplier» à titre d'exemple, nous pouvons mélanger deux images de la manière suivante:

 <span><span><span class="hljs-variable">$bg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefrompng</span></span><span>(</span><span><span class="hljs-string">'background.png'</span></span><span>); </span><span><span class="hljs-comment">// Image de fond</span></span><span>
</span><span><span class="hljs-variable">$fg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefrompng</span></span><span>(</span><span><span class="hljs-string">'foreground.png'</span></span><span>); </span><span><span class="hljs-comment">// Carte de premier plan</span></span><span>
</span><span><span class="hljs-variable">$width</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagesx</span></span><span>(</span><span><span class="hljs-variable">$bg</span></span><span>);
</span><span><span class="hljs-variable">$height</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagesy</span></span><span>(</span><span><span class="hljs-variable">$bg</span></span><span>);

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatetruecolor</span></span><span>(</span><span><span class="hljs-variable">$width</span></span><span>, </span><span><span class="hljs-variable">$height</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagealphablending</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagesavealpha</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);

</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$y</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$y</span></span><span> &lt; </span><span><span class="hljs-variable">$height</span></span><span>; </span><span><span class="hljs-variable">$y</span></span><span>++) {
    </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$x</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$x</span></span><span> &lt; </span><span><span class="hljs-variable">$width</span></span><span>; </span><span><span class="hljs-variable">$x</span></span><span>++) {
        </span><span><span class="hljs-variable">$bgColor</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorat</span></span><span>(</span><span><span class="hljs-variable">$bg</span></span><span>, </span><span><span class="hljs-variable">$x</span></span><span>, </span><span><span class="hljs-variable">$y</span></span><span>);
        </span><span><span class="hljs-variable">$fgColor</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorat</span></span><span>(</span><span><span class="hljs-variable">$fg</span></span><span>, </span><span><span class="hljs-variable">$x</span></span><span>, </span><span><span class="hljs-variable">$y</span></span><span>);

        </span><span><span class="hljs-variable">$bgR</span></span><span> = (</span><span><span class="hljs-variable">$bgColor</span></span><span> &gt;&gt; </span><span><span class="hljs-number">16</span></span><span>) &amp; </span><span><span class="hljs-number">0xFF</span></span><span>;
        </span><span><span class="hljs-variable">$bgG</span></span><span> = (</span><span><span class="hljs-variable">$bgColor</span></span><span> &gt;&gt; </span><span><span class="hljs-number">8</span></span><span>) &amp; </span><span><span class="hljs-number">0xFF</span></span><span>;
        </span><span><span class="hljs-variable">$bgB</span></span><span> = </span><span><span class="hljs-variable">$bgColor</span></span><span> &amp; </span><span><span class="hljs-number">0xFF</span></span><span>;

        </span><span><span class="hljs-variable">$fgR</span></span><span> = (</span><span><span class="hljs-variable">$fgColor</span></span><span> &gt;&gt; </span><span><span class="hljs-number">16</span></span><span>) &amp; </span><span><span class="hljs-number">0xFF</span></span><span>;
        </span><span><span class="hljs-variable">$fgG</span></span><span> = (</span><span><span class="hljs-variable">$fgColor</span></span><span> &gt;&gt; </span><span><span class="hljs-number">8</span></span><span>) &amp; </span><span><span class="hljs-number">0xFF</span></span><span>;
        </span><span><span class="hljs-variable">$fgB</span></span><span> = </span><span><span class="hljs-variable">$fgColor</span></span><span> &amp; </span><span><span class="hljs-number">0xFF</span></span><span>;

        </span><span><span class="hljs-comment">// Multiply Formule de motif: result = (A * B) / 255</span></span><span>
        </span><span><span class="hljs-variable">$newR</span></span><span> = (</span><span><span class="hljs-variable">$bgR</span></span><span> * </span><span><span class="hljs-variable">$fgR</span></span><span>) / </span><span><span class="hljs-number">255</span></span><span>;
        </span><span><span class="hljs-variable">$newG</span></span><span> = (</span><span><span class="hljs-variable">$bgG</span></span><span> * </span><span><span class="hljs-variable">$fgG</span></span><span>) / </span><span><span class="hljs-number">255</span></span><span>;
        </span><span><span class="hljs-variable">$newB</span></span><span> = (</span><span><span class="hljs-variable">$bgB</span></span><span> * </span><span><span class="hljs-variable">$fgB</span></span><span>) / </span><span><span class="hljs-number">255</span></span><span>;

        </span><span><span class="hljs-variable">$color</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocatealpha</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>, </span><span><span class="hljs-variable">$newR</span></span><span>, </span><span><span class="hljs-variable">$newG</span></span><span>, </span><span><span class="hljs-variable">$newB</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
        </span><span><span class="hljs-title function_ invoke__">imagesetpixel</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>, </span><span><span class="hljs-variable">$x</span></span><span>, </span><span><span class="hljs-variable">$y</span></span><span>, </span><span><span class="hljs-variable">$color</span></span><span>);
    }
}

</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>, </span><span><span class="hljs-string">'output.png'</span></span><span>);
</span></span>

Cet exemple montre comment réaliser des effets de multiplication et de mélange en mélangeant des valeurs RVB de deux images pixels par pixel. Bien que les performances ne soient pas aussi bonnes que celles des appels de bibliothèque sous-jacentes, il a des degrés de liberté extrêmement élevés et convient aux scénarios où un contrôle précis du processus de synthèse d'image est nécessaire.

4. Résumé

ImageLeLayEreffect () peut simplifier le traitement du mélange d'images dans certains scénarios de base, en particulier pour prendre en charge les opérations de fusion Alpha. Mais ses capacités sont limitées et ne peuvent pas couvrir tous les types de modes hybrides. Pour les besoins de mélange d'images plus complexes, les développeurs devraient envisager de traiter manuellement les pixels, ou utiliser des bibliothèques de traitement d'image plus complètes telles que ImageMagick ou appeler des outils externes.

Bien que PHP ne soit pas un langage de traitement d'image spécial, il s'agit toujours d'un choix stable et contrôlable lors de la génération ou du traitement d'images du côté serveur. La combinaison raisonnable des fonctions de bibliothèque GD et de la logique d'algorithme peut réaliser de nombreuses possibilités d'édition d'image.