2016-02-24 3 views
0

Мне нужно объединить размытый прямоугольник на другое изображение (белый прямоугольник). Я попробовал imagesavealpha(), но, к сожалению, фон прямоугольника остается черным, и я хочу его с градиентом от красного до белого.PHP GD: объединить размытый прямоугольник

Вот мой код:

<?php 
$width = 200; 
$height = 180; 

$bw = $bh = 30; 

$img1 = imagecreatetruecolor($width, $height); 
$img2 = imagecreatetruecolor($width, $height); 

$white = imagecolorallocate($img1, 255, 255, 255); 
$red = imagecolorallocate($img2, 255, 0, 0); 
imagefilledrectangle($img1, 0, 0, 100, 100, $white); 
imagefilledrectangle($img2, 5, 5, 25, 25, $red); 

imagefilter($img2, IMG_FILTER_GAUSSIAN_BLUR); 
imagefilter($img2, IMG_FILTER_GAUSSIAN_BLUR); 
imagefilter($img2, IMG_FILTER_GAUSSIAN_BLUR); 
imagefilter($img2, IMG_FILTER_GAUSSIAN_BLUR); 
imagefilter($img2, IMG_FILTER_GAUSSIAN_BLUR); 

imagesavealpha($img2, true); 

imagecopymerge($img1, $img2, 20, 20, 0, 0, $bw, $bh, 100); 

header('Content-Type: image/png'); 
imagepng($img1); 

imagedestroy($img1); 

restulting изображение:

enter image description here

ответ

2

Если вы просто хотите помутнение красный прямоугольник на белом фоне код можно упростить это:

<?php 
$width = 200; 
$height = 180; 

$img = imagecreatetruecolor($width, $height); 

// fill with opaque white. 
imagefill($img, 0, 0, 0x00ffffff); 

// draw rectangle in opaque red. 
imagefilledrectangle($img, 5, 5, 25, 25, 0x00ff00000); 

for ($i = 0; $i < 5; $i++) { 
    imagefilter($img, IMG_FILTER_GAUSSIAN_BLUR); 
} 

header('Content-Type: image/png'); 
imagepng($img); 
imagedestroy($img); 

Результат (разумеется, белый ba ckground сливается с фоном страницы ...):

result

Если вы хотите, чтобы иметь возможность смешать красный прямоугольник с любым цветом фона (полный альфа смешивания), то вы можете быть не повезло. Насколько я могу судить, IMG_FILTER_GAUSSIAN_BLUR не поддерживает альфа-значения (я использую PHP 7.0.3).

+0

На самом деле мой реальный фон не просто белый, это образец. Но 'MG_FILTER_GAUSSIAN_BLUR', не поддерживающий альфа-значения, отвечает на мой вопрос. Вы знаете альтернативу получить аналогичный или приближающийся результат? – rooofl

+1

Не в GD. Я попробовал [пример для 'imageconvolution'] (http://php.net/manual/en/function.imageconvolution.php#example-3501), но получил точно такой же результат, что и' imagefilter'. [ImageMagick] (http://php.net/manual/en/imagick.gaussianblurimage.php), вероятно, лучший выбор, но он не всегда доступен. – timclutton

Смежные вопросы