Задать вопрос
Lobochkin
@Lobochkin
PHP Bitrix Vue Laravel

Как убрать фон который образуется при повороте картинки imagerotate()?

5d237ac8ac2bf359386408.jpeg
ставлю водный знаки на картинку, проблема в том когда я поворачиваю водный знак ,у него появляется фон, который не знаю как убрать
function watermark($image, $stamp, $alpha, $degrees) {
	$stamp = imagecreatefrompng($stamp); //Логотип, размер произвольный
	$stamp = imagerotate($stamp , $degrees, 255);

	$sx = imagesx($stamp); //Получаем ширину
	$sy = imagesy($stamp); //Высоту


	$alpha = $alpha * 127 / 100; 
	$padding = 5; // отступ от повторения штампа
	imagealphablending($stamp, false);
	imagesavealpha($stamp, true);
	for( $x = 0; $x < $sx; $x++ ){ 
		for( $y = 0; $y < $sy; $y++ ){ 
			$colorxy = imagecolorat( $stamp, $x, $y ); 

			$alphacolorxy = imagecolorallocatealpha( $stamp,
		    	( $colorxy >> 16 ) & 0xFF,
		    	( $colorxy >> 8 ) & 0xFF,
		    	  $colorxy & 0xFF,
		    	  $alpha
			); 
			imagesetpixel($stamp, $x,$y, $alphacolorxy);
			if( !imagesetpixel( $stamp, $x, $y, $alphacolorxy ) ){ 
				echo "string";
				return false; 
			} 
		} 
	} 

	$im = imagecreatefromjpeg($image); //Исходная картинка
	$im_x = imagesx($im);
	$im_y = imagesy($im);
	$repeat_x = ceil($im_x/($sx));
	$repeat_y = ceil($im_y/($sy));
	for ($i=1; $i <= $repeat_x; $i+=2) { 
		for ($j=1; $j <= $repeat_y; $j+=2) { 

			imagecopy($im, $stamp, $im_x - $sx*$i,  $im_y - $sy*$j, 0, 0, $sx, $sy);
		}
	}
	var_dump($im);
	imagejpeg($im, 'new_' . $image, 100); //Создаем изображение
	imagedestroy($im); //Чистим за собой
	imagedestroy($stamp); //Чистим за собой
}

watermark('image.jpg', 'watermark.png', 70, 30);
echo "<img src='new_image.jpg'>";
  • Вопрос задан
  • 337 просмотров
Подписаться 1 Средний 25 комментариев
Решения вопроса 1
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
$image = imagecreatefromstring(file_get_contents('test.jpg'));

// получаем разеры исходника

$ix = imagesx($image);
$iy = imagesy($image);

// делаем холст с заливкой фона

$newimage = imagecreatetruecolor($ix, $iy);
$transparent = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparent);
imagealphablending($newimage, true);
imagesavealpha($newimage, true);

// накладываем исходник на холст

imagecopyresampled($newimage, $image, 0, 0, 0, 0, $ix, $iy, $ix, $iy);

// берем вотермарку

$imageW = imagecreatefromstring(file_get_contents('logo.png'));

$wx = imagesx($imageW);
$wy = imagesy($imageW);

// для поворота нужен прозрачный холст

$new = imagecreatetruecolor($wx, $wy);

$transparent = imagecolorallocatealpha($new, 0, 0, 0, 127);
$rotate = imagerotate($imageW, 45, $transparent);
imagealphablending($rotate, true);
imagesavealpha($rotate, true);

// пересчет размеров после поворота

$ix = imagesx($rotate);
$iy = imagesy($rotate);

// наложение 50 50 начало от левого верхнего угла

imagecopyresampled($image, $rotate, 50, 50, 0, 0, $ix, $iy, $ix, $iy);

// сохранение

imagepng($image, 'testus.png', 9, PNG_ALL_FILTERS);

5d2518ff9776c439694328.jpeg
5d25190dbbe14223771085.png
5d2519bb92a74841010101.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xEpozZ
@xEpozZ
Веб-разработчик
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы