Наложение маски на изображение

Рецепт №104. Из книги «128 рецептов php»
Перейти к оглавлению

При наложении маски исходное изображение будет обрезано по форме маски, в роли которой может любая картинка, допустимого формата – jpeg, jpg, png, gif. Картинка-маска должна иметь однотонный цвет в области, которая будет сохранена, например черный. А все остальное, что будет удалено, должно иметь любой другой цвет, главное не черный.

Таким образом, имея две картинки – исходную и маску, мы можем сделать наложение. Для наложения маски нет специальных функций, но можно попиксельно перенести исходную картинку на чистый холст, предварительно проверяя цвет пикселя у картинки-маски по тем же координатам.
Пример:

// исходная картинка
$image = "test.jpg"; 
// картинка маска
$mask = "mask.png";

// загружаем исходную картинку
$image = imagecreatefromjpeg($image); 
// загружаем маску
$mask = imagecreatefrompng($mask); 
// определяем ширину картинки
$width =  imagesx($image); 
// определяем высоту картинки
$height = imagesy($image); 
// определяем ширину маски
$m_width =  imagesx($mask); 
// определяем высоту маски
$m_height = imagesy($mask); 

// создаем холст для будущей картинки
$img = imagecreatetruecolor($width, $height); 
// определяем прозрачный цвет для картинки. Черный
$transColor = imagecolorallocate($img, 0, 0, 0); 
// задаем прозрачность для картинки
imagecolortransparent($img, $transColor); 

// перебираем исходную картинку по пикселю
for($posX = 0; $posX < $width; $posX++){ 
  for($posY = 0; $posY < $height; $posY++){
	  // получаем индекс цвета пикселя 
	  // в координате $posX, $posY для картинки
	  $colorIndex = imagecolorat($image, $posX, $posY); 
	  // получаем цвет по его индексу в формате RGB
	  $colorImage = imagecolorsforindex($image, $colorIndex); 
	  // получаем индекс цвета пикселя 
	  // в координате $posX, $posY для маски
	  $colorIndex = imagecolorat($mask, $posX, $posY); 
	  // получаем цвет по его индексу в формате RGB
	  $maskColor = imagecolorsforindex($mask, $colorIndex);
	  // если в точке $posX, $posY цвет маски черный, 
	  // то наносим на холст пиксель с нужным цветом
	  if (
		// проверка пикселя на черный цвет
		$maskColor['red'] == 0 AND 
		$maskColor['green'] == 0 AND 
		$maskColor['blue'] == 0 AND
		// если размер маски меньше исходной картинки,
		// то за ее пределами тоже ни чего не рисуем
		$m_width > $posX AND 
		$m_height > $posY
	   ){
		// получаем цвет для пикселя
		$colorIndex = imagecolorallocate(
			$img,
			$colorImage['red'], 
			$colorImage['green'], 
			$colorImage['blue']
		); 
		// рисуем пиксель
		imagesetpixel($img, $posX, $posY, $colorIndex); 
	  } 
  }
}
	
// заголовок для браузера
header('Content-type: image/png'); 
// выводим картинку в браузере
imagepng($img); 
// чистим память
imagedestroy($img); 

В рецепте использовалось несколько ранее не описанных функций, о каждой по порядку.
Imagesx и imagesy – получают ширину и высоту изображения.
imagecolortransparent – определяет выбранный цвет как прозрачный.
imagecolorat – получает индекс цвет а пикселя по заданным координатам.
imagecolorsforindex – получает цвета в формате RGBA, соответствующие индексу.
imagesetpixel – рисует пиксель по заданным координатам.

Рассказать друзьям:


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*