Рецепт №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 – рисует пиксель по заданным координатам.
