Наложения водяного знака на картинку

Водяным знаком может служить текст или картинка. Как
накладывать текст, можно почитать в предыдущих рецептах, а как
наложить на одно изображение другое, описано ниже.

При наложении водяных знаков, накладываемой картинке задается
прозрачность 40-60%.
В примере, приведенном ниже, водяному знаку будет задана
прозрачность 60% и размещен он будет в нижний правый угол.
Пример:

// исходная картинка 
$img = "test.jpg";  
// получаем размер картинки 
$size = getimagesize($img);  
$height = $size[1]; // высота 
$width = $size[0]; // ширина 
  
// картинка, которая будет использована  
// в качестве водяного знака 
$watermark_src = 'watermark.png';  
// получаем размер водяного знака 
$sizeWM = getimagesize($watermark_src);  
$heightWM = $sizeWM[1]; // высота водяного знака 
$widthWM = $sizeWM[0]; // ширина водяного знака 
// задаем прозрачность водяного знака 
$opacity = 60;  
  
//Загружаем изображения  
$image = imagecreatefromjpeg($img); 
$watermark = imagecreatefrompng($watermark_src); 
 
// высчитываем координаты, для водяного знака.  
// Внизу справа 
$x = $width - $widthWM; 
$y = $height - $heightWM; 
  
//Копируем водяной знак на изображение 
imagecopymerge( 
$image, $watermark, $x, $y, 0, 0,  
$widthWM, $heightWM, $opacity 
); 
 
// задаем заголовок, чтоб вывести результат в браузере 
header('Content-Type: image/jpeg'); 
 
// выводим картинку 
imagejpeg($image); 
// очищаем память 
imagedestroy($image); 
imagedestroy($watermark);


В примере, была использована, ранее не описанная функция -
imagecopymerge. Она позволяет копировать часть изображения и
накладывать его на другое изображение. А также при наложении
есть возможность задавать прозрачность, для копируемого
изображения.

Добавлено: 28 Марта 2018 13:51:23 Добавил: Андрей Ковальчук

Наложение PNG картинок с прозрачностью

В прошлом примере, наложение происходило без учета
прозрачности, накладываемой картинки. Даже если бы
прозрачность и существовала, то вместо нее бы появился белый
цвет. В этом рецепте мы исправим этот недочет. Поможет в этом
функция - imagecopy, которая копирует одно изображение на
другое.
Пример:

// исходная картинка 
$img = "test.jpg";  
 
// накладываемая картинка 
$watermark_src = 'watermark.png';  
// получаем ее размер 
$sizeWM = getimagesize($watermark_src);  
$heightWM = $sizeWM[1]; // высота 
$widthWM = $sizeWM[0]; // ширина 
 
// Загружаем изображения  
$image = imagecreatefromjpeg($img); 
$watermark = imagecreatefrompng($watermark_src); 
// задаем прозрачность 
imagesavealpha($watermark, true);  
 
// координаты верхнего левого угла накладываемой картинки 
$x = 50; 
$y = 50; 
  
// Копируем 
imagecopy( 
$image, $watermark, $x, $y, 0, 0,  
$widthWM, $heightWM 
); 
 
// задаем заголовок, чтоб вывести результат в браузере 
header('Content-Type: image/jpeg'); 
// выводим картинку 
imagejpeg($image); 
// очищаем память 
imagedestroy($image); 
imagedestroy($watermark);

Добавлено: 28 Марта 2018 13:49:52 Добавил: Андрей Ковальчук

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

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

imagecolorat – получает индекс цвет а пикселя по заданным
координатам.
imagecolorsforindex – получает цвета в формате RGBA,
соответствующие индексу.
imagesetpixel – рисует пиксель по заданным координатам.

Добавлено: 28 Марта 2018 13:47:48 Добавил: Андрей Ковальчук

Закругление углов картинки

Стандартных функций, которые выполняют закругление углов, не существует. Поэтому необходимо самим разрабатывать алгоритм для таких случаев. Один из способов реализации закругления углов, приведен в рецепте: создается вспомогательное квадратное изображение с шириной и высотой равной радиусу закругления. После этого, на вспомогательное изображение накладывается прозрачный эллипс, который оставляет видимым только скругленный угол, все остальное перекрывается. Чтобы перекрыть часть изображения прозрачным эллипсом, необходимо выключить режим сопряжения цветов. Когда получилось создать изображение с видимым скругленным уголком и прозрачным фоном, его необходимо просто нанести на четыре угла изображения, у которого необходимо сделать закругление углов.
Пример:

// исходная картинка 
$image = "test.jpg";  
// радиус углов 
$radius = 50; 
// цвет, которым будет заполнен угол 
$background = 0xffffff; 
 
// загружаем картинку 
$img = imagecreatefromjpeg($image); 
// размер исходной картинки 
$width = imagesx($img); 
$height = imagesy($img); 
// создаем изображение для углов 
$corner = imagecreatetruecolor($radius, $radius); 
// выключаем режим сопряжения цветов 
imagealphablending($corner, false); 
// прозрачный цвет 
$trans = imagecolorallocatealpha( 
$corner, 255, 255, 255, 127 
); 
// заливаем картинку для углов 
imagefill($corner, 0, 0, $background); 
// рисуем прозрачный эллипс 
imagefilledellipse( 
$corner, $radius, $radius,  
$radius * 2, $radius * 2, $trans 
); 
// массив положений.  
// Для расположения эллипсов по углам 
$positions = array( 
  array(0, 0), 
  array($width - $radius, 0), 
  array($width - $radius, $height - $radius), 
  array(0, $height - $radius), 
); 
// накладываем на углы картинки  
// изображения с эллипсами 
foreach ($positions as $pos) { 
  // копируем эллипс на картинку 
  imagecopyresampled( 
    $img, $corner, $pos[0], $pos[1], 0, 0,  
$radius, $radius, $radius, $radius 
  ); 
  // поворачиваем изображение с эллипсом 
// каждый раз на 90 градусов 
  $corner = imagerotate( 
$corner, -90, $background, false 
); 
} 
   
// заголовок для браузера 
 
header('Content-type: image/png');  
// выводим картинку в браузере 
imagepng($img);  
// чистим память 
imagedestroy($img);

Добавлено: 28 Марта 2018 13:44:42 Добавил: Андрей Ковальчук

Зеркальное отображение картинки

Для зеркального отображения картинки необходимо просто перебрать все пиксели с исходного изображения и перенести их в обратном порядке на чистый холст.
Пример:

// исходная картинка 
$image = "test.jpg";
// загружаем картинку
$source = imagecreatefromjpeg($image);
// получаем размеры картинки 
$size = getimagesize($image);
// создаем новое изображение. пустой холст 
$img = imagecreatetruecolor($size[0], $size[1]);
// наносим попиксельно изображение в обратном порядке 
for ($x = 0; $x < $size[0]; $x++){
for ($y = 0; $y < $size[1]; $y++){
$color = imagecolorat($source, $x,$y); 
imagesetpixel($img, $size[0]-$x, $y, $color);
}
}
// заголовок для браузера
header('Content-type: image/png');
// выводим картинку в браузере 
imagepng($img);
// чистим память
imagedestroy($img); 
imagedestroy($source);

Добавлено: 28 Марта 2018 13:41:47 Добавил: Андрей Ковальчук

Создание черно-белой картинки из цветной

Для преобразования цветной картинки в черно-белую, необходимо создать пустой холст размером, как и исходная картинка. После этого, необходимо задать пустому изображению черно-белую (серую) палитру. И этих приготовлений остается только объединить исходное изображение с пустым холстом и вывести результат.
Пример:

// исходная картинка 
$image = "test.jpg";
// получаем размеры исходного изображения 
$imgSize = getimagesize($image);
$width = $imgSize[0];
$height = $imgSize[1];
// создаем новое изображение
$img = imagecreate($width,$height);
// задаем серую палитру для нового изображения 
for ($color = 0; $color <= 255; $color++) {
imagecolorallocate($img, $color, $color, $color);
}
// создаем изображение из исходного 
$source = imagecreatefromjpeg($image);
// объединяем исходное изображение и серое 
imagecopymerge($img, $source, 0,0,0,0,$width, $height, 100);
// заголовок для браузера
header('Content-type: image/png');
// выводим картинку в браузере 
imagepng($img);
// чистим память 
imagedestroy($img); 
imagedestroy($source);

Добавлено: 28 Марта 2018 13:40:21 Добавил: Андрей Ковальчук

Перевод цвета из HEX в RGB

В рецепте приведен пример перевода кода цвета из HEX в RGB.
Пример:

// перевод цвета из HEX в RGB 
function hexToRgb($color) {
// проверяем наличие # в начале,
// если есть, то отрезаем ее 
if ($color[0] == '#')	{
$color = substr($color, 1);
}
// разбираем строку на массив 
if (strlen($color) == 6)	{
// если hex цвет в полной форме - 6 символов 
list($red, $green, $blue) = array(
$color[0] . $color[1],
$color[2] . $color[3],
$color[4] . $color[5]
);
} elseif (strlen($cvet) == 3)	{
// если hex цвет в сокращенной
// форме - 3 символа
list($red, $green, $blue) = array(
$color[0]. $color[0],
$color[1]. $color[1],
$color[2]. $color[2]
);
}else{
return false;
}
// переводим шестнадцатеричные числа в десятичные 
$red = hexdec($red);
$green = hexdec($green);
$blue = hexdec($blue);
// вернем результат 
return array(
'red' => $red,
'green' => $green, 'blue' => $blue
);
}
// пример использования 
$colorHex = '#FFAA00';
$result = hexToRgb($colorHex); 
var dump($result);

Добавлено: 28 Марта 2018 13:38:10 Добавил: Андрей Ковальчук

Перевод цвета из RGB в HEX

В рецепте приведен пример перевода кода цвета из RGB в HEX. Пример:

// перевод цвета из RGB в HEX 
function rgbToHex($color) {
$red = dechex($color[0]);
$green = dechex($color[1]);
$blue = dechex($color[2]);
return "#" . $red . $green . $blue;
}
// пример использования 
$colorRgb = array(125, 255, 0);
$result = rgbToHex($colorRgb); 
var dump($result);

Добавлено: 28 Марта 2018 13:35:31 Добавил: Андрей Ковальчук

Генерация случайной капчи

Не редко, для защиты от спама формы, например, обратной связи, используется капча - картинка с набором символов. Как реализовать саму картинку-капчу, показано в этом рецепте.
Пример:

// список символов, используемых в капче 
$let = '0123456789ABCDEFGH';
// количество символов в капче 
$len = 4;
// шрифт
$font = 'impact.ttf';
// Размер шрифта 
$fontsize = 20;
// Размер капчи 
$width = 100;
$height = 30;
// создаем изображение
$img = imagecreatetruecolor($width, $height);
// фон
$white = imagecolorallocate($img, 220, 220, 220); 
imagefill($img, 0,0, $white);
// Переменная, для хранения значения капчи 
$capchaText = '';
// Заполняем изображение символами 
for ($i = 0; $i < $len; $i++){
// Из списка символов, берем случайный символ 
$capchaText .= $let[rand(0, strlen($let)-1)]; 
// Вычисляем положение одного символа 
$x = ($width - 20)/ $len * $i + 10;
$y = $height - (($height - $fontsize) / 2);
// Укажем случайный цвет для символа 
$color = imagecolorallocate(
$img, rand(0, 150), rand(0, 150), rand(0, 150)
);
// Генерируем угол наклона символа 
$naklon = rand(-30, 30);
// Рисуем символ 
imagettftext($img, $fontsize, $naklon, $x,$y, $color, $font, $capchaText[$i]);
}
// заголовок для браузера
header('Content-type: image/png');
// вывод капчи на страницу 
imagepng($img);
// чистим память 
imagedestroy($img);

Добавлено: 28 Марта 2018 13:34:14 Добавил: Андрей Ковальчук

Генерация арифметической капчи

В предыдущем рецепты уже был рассмотрен пример генерации капчи. Но прошлый раз выводились просто символы. Эту капчу можно немного модернизировать, реализовать ее в виде арифметического примера - например, вычисление суммы.
Пример:

// шрифт
$font = 'impact.ttf';
// Размер шрифта 
$fontsize = 20;
// Размер капчи 
$width = 120;
$height = 40;
// придумываем пример для капчи 
$a = mt rand(1, 19);
$b = mt rand(1, 19);
$capchaText = $a.'+'.$b.'=';
// Ответ на пример 
$capchaResult = $a + $b;
// создаем изображение
$img = imagecreatetruecolor($width, $height);
// фон
$white = imagecolorallocate($img, 220, 220, 220); 
imagefill($img, 0,0, $white);
// Заполняем изображение символами
for ($i = 0; $i < strlen($capchaText); $i++){
// Из списка символов, берем случайный символ 
$litteral = $capchaText[$i];
// Вычисляем положение одного символа
$x = ($width - 20) / strlen($capchaText) * $i +10;
$y = $height - (($height - $fontsize) / 2);
// Сгенерируем случайный цвет для символа.
$color = imagecolorallocate(
$img, rand(0, 150), rand(0, 150), rand(0, 150));
// Генерируем угол наклона символа 
$naklon = rand(-10,	10);
// Рисуем один символ 
imagettftext($img, $fontsize, $naklon, $x, $y,$color, $font, $litteral);
}
// Добавим на капчу несколько рандомных полосок 
for ($i = 0; $i < $countLine; $i++){
// сгенерируем координаты для линии
$part = $width/100; 
// длина картинки в процентах
// x1 не больше чем до 30% картинки
$x1 = mt rand(0, round($part*30));
$y1 = mt rand(0, $height);
// x2 не меньше чем от 70% картики
$x2 = mt rand(round($part*70),round($part*100));
$y2 = mt rand(0, $height);
// сгенерируем случайный цвет для линии 
$color = imagecolorallocate(
$img, rand(0, 150), rand(0, 150), rand(0, 150));
imageline ($img, $x1, $y1, $x2, $y2, $color);
}
// заголовок для браузера
header('Content-type: image/png');
// вывод капчи на страницу 
imagepng($ img);
// чистим память 
imagedestroy($img);

Добавлено: 28 Марта 2018 12:51:05 Добавил: Андрей Ковальчук

Вывод случайной картинки

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

<img src="/randomImg.php" />

Код скрипта randomImg. php:
// устанавливаем заголовок для вывода картинки 
header("Content-type: image/jpeg");
// массив картинок 
$imgPathArray = array(
'test.jpg',
'test2.jpg',
'test3.jpg'
);
// берем случайную картинку 
$imgPath = $imgPathArray[mt rand(0, count($imgPathArray)-1)];
// загружаем картинку
$img = imagecreatefromjpeg($imgPath);
// выводим картинку в браузере 
imagejpeg($img);
// очищаем память 
imageDestroy($image);

Добавлено: 28 Марта 2018 12:48:03 Добавил: Андрей Ковальчук