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