IMG_EFFECT_OVERLAY doesn't work in PHP 5.6.0 with GD version: 2.1.0-alpha.(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
imagelayereffect β Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ»Π°Π³ Π°Π»ΡΡΠ°-ΡΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ΅ΠΊΡΡ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ»Π°Π³ Π°Π»ΡΡΠ°-ΡΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ΅ΠΊΡΡ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ.
imageeffectΠΠΎΠ½ΡΡΠ°Π½ΡΠ° ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°:
IMG_EFFECT_REPLACEtrue Π² ΡΡΠ½ΠΊΡΠΈΡ
imagealphablending()
IMG_EFFECT_ALPHABLENDfalse Π² ΡΡΠ½ΠΊΡΠΈΡ
imagealphablending()
IMG_EFFECT_NORMALIMG_EFFECT_ALPHABLEND.
IMG_EFFECT_OVERLAYIMG_EFFECT_MULTIPLY
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true.
| ΠΠ΅ΡΡΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| 8.0.0 |
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ image ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ GdImage;
ΡΠ°Π½ΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π» ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ gd-ΡΠ΅ΡΡΡΡ (resource).
|
| 7.2.0 |
ΠΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΡΡΠ΅ΠΊΡ IMG_EFFECT_MULTIPLY; Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΡΡΠ΅ΠΊΡΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½Π°Ρ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° libgd >= 2.1.1 ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° libgd, ΠΊΠΎΡΠΎΡΠ°Ρ Π²Ρ
ΠΎΠ΄ΠΈΡ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°.
|
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ»Π°Π³Π° Π°Π»ΡΡΠ°-ΡΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ imagelayereffect()
<?php
// ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
$im = imagecreatetruecolor(100, 100);
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠΎΠ½
imagefilledrectangle($im, 0, 0, 100, 100, imagecolorallocate($im, 220, 220, 220));
// ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ»Π°Π³ Π°Π»ΡΡΠ°-ΡΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΡ Π΄Π»Ρ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΡ
imagelayereffect($im, IMG_EFFECT_OVERLAY);
// Π ΠΈΡΡΠ΅ΠΌ Π΄Π²Π° ΡΠ΅ΡΡΡ
ΡΠ»Π»ΠΈΠΏΡΠ°
imagefilledellipse($im, 50, 50, 40, 40, imagecolorallocate($im, 100, 255, 100));
imagefilledellipse($im, 50, 50, 50, 80, imagecolorallocate($im, 100, 100, 255));
imagefilledellipse($im, 50, 50, 80, 50, imagecolorallocate($im, 255, 100, 100));
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ MIME-ΡΠΈΠΏΠΎΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
header('Content-type: image/png');
imagepng($im);ΠΡΠ²ΠΎΠ΄ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡ ΠΎΠΆ Π½Π°:
^^ my name is coreyward ^^
imagelayereffect needs to be applied to the destination image, not the source image. As noted, the only useful "effect" as of this time is IMG_EFFECT_OVERLAY since the others are merely another way of setting the alpha blending flag.
You can also use imagecopymerge with a lower pct argument to blend two images with more control over the opacity at which the top image is blended.
<?
// overlays $im_src onto $im_dst properly (assuming same dims)
imagelayereffect($im_dst, IMG_EFFECT_OVERLAY);
imagecopy($im_dst, $im_src, 0, 0, 0, 0, $im_dst_x, $im_dst_y);
?>I found the following example on a Chinese site and translated and adjusted it. It creates a portrait from the sample picture.
<?php
// Portrait image
$im = imagecreatefromjpeg( "sample.jpg");
// Get width and height
$w = imagesx($im);
$h = imagesy($im);
// Non-through
$c_visible = 0x007F7F7F;
// Background (black)
$c_bg = 0x00000000;
// Create mask
$im_mask = imagecreatetruecolor($w,$h);
imageFilledRectangle($im_mask, 0,0, $w,$h, $c_bg);
imageFilledEllipse ($im_mask, $w/2,$h/2, $w*.9,$h*.9, $c_visible);
// Only overlay seems to something useful
imagelayereffect($im_mask, IMG_EFFECT_OVERLAY);
imagecopy($im_mask, $im, 0,0, 0,0, $w,$h);
imagedestroy($im);
imagepng($im_mask);
imagedestroy($im_mask);
?>
Try removing the 'create mask' code and just add another image with 'createimagefromjpeg' to see 'normal' overlay. It blends the colors like different layers in Photoshop.I have been getting a fatal error:
Fatal error: Call to undefined function imagelayereffect()
This doesn't work with Ubuntu server (8.04 lts) and the php5-gd package. If you need this you will have to recompile PHP with GD built-in.