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

При наложении маски исходное изображение будет обрезано по форме маски, в
роли которой может любая картинка, допустимого формата – 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 – рисует пиксель по заданным координатам.

Источник: Из книги «128 рецептов php»

02:10
724
RSS
Нет комментариев. Ваш будет первым!
Загрузка...