You are here

function iek_gd_watermark in Image effect kit 7

Add a watermark text on an image by using the GD toolkit.

Parameters

object $image: An image object. The $image->resource, $image->info['width'], and $image->info['height'] values will be modified by this call.

array $data: An array that contains all the effect parameters. $data['font']: the font of watermark. $data['color']: the font color of watermark. $data['angle']: the rotate angle of watermark. $data['x']: the x-axis of watermark. $data['y']: the y-axis of watermark.

Return value

bool TRUE or FALSE, based on success.

File

./iek.gd.inc, line 420
GD2 toolkit for image manipulation within Drupal.

Code

function iek_gd_watermark(stdClass $image, $data) {

  // Replaces text with tokens.
  $text = token_replace($data['text']);
  $angle = 360 - $data['angle'];
  $size = $data['size'];
  $position = $data['position'];
  $padding_top = $data['padding_top'];
  $padding_right = $data['padding_right'];
  $padding_bottom = $data['padding_bottom'];
  $padding_left = $data['padding_left'];
  $width = $image->info['width'];
  $height = $image->info['height'];
  $iek_font = iek_get_watermark_fonts($data['font']);
  $font = drupal_realpath($iek_font['path'] . '/' . $iek_font['file']);
  $dst = imagecreatetruecolor($width, $height);
  $text_rgb = iek_image_hex2rgb($data['color']);
  $text_color = imagecolorallocate($dst, $text_rgb['red'], $text_rgb['green'], $text_rgb['blue']);

  // Wraps the watermark text.
  $bbox = imagettfbbox($size, $angle, $font, $text);
  $bbox_width = abs($bbox[2] - $bbox[0]);
  $bbox_height = abs($bbox[5] - $bbox[3]);
  $bbox_character_width = 0;
  if (strlen($text)) {
    $bbox_character_width = ceil($bbox_width / strlen($text));
  }
  $bbox_character_height = ceil($bbox_height);
  $text_arr = array();
  if ($bbox_character_width) {
    $text_arr = chunk_split($text, ceil(($width - abs(($padding_left + $padding_right) * 2)) / $bbox_character_width), ':::');
    $text_arr = explode(':::', $text_arr);
  }
  switch ($position) {
    case 'top_left':
      $new_y = $bbox_character_height + $padding_top;
      foreach ($text_arr as $text_arr_item) {
        $new_x = $padding_left;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'top_center':
      $new_y = $bbox_character_height + $padding_top;
      foreach ($text_arr as $text_arr_item) {
        $new_x = ($width - $bbox_character_width * strlen($text_arr_item)) / 2;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'top_right':
      $new_y = $bbox_character_height + $padding_top;
      foreach ($text_arr as $text_arr_item) {
        $cur_bbox = imagettfbbox($size, $angle, $font, $text_arr_item);
        $cur_bbox_width = abs($cur_bbox[2] - $cur_bbox[0]);
        $new_x = $width - $cur_bbox_width - $padding_right;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'middle_left':
      $new_y = $height / 2 - $bbox_character_height * count($text_arr) / 2 + $bbox_character_height;
      foreach ($text_arr as $text_arr_item) {
        $new_x = $padding_left;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'middle_center':
      $new_y = $height / 2 - $bbox_character_height * count($text_arr) / 2 + $bbox_character_height;
      foreach ($text_arr as $text_arr_item) {
        $new_x = ($width - $bbox_character_width * strlen($text_arr_item)) / 2;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'middle_right':
      $new_y = $height / 2 - $bbox_character_height * count($text_arr) / 2 + $bbox_character_height;
      foreach ($text_arr as $text_arr_item) {
        $cur_bbox = imagettfbbox($size, $angle, $font, $text_arr_item);
        $cur_bbox_width = abs($cur_bbox[2] - $cur_bbox[0]);
        $new_x = $width - $cur_bbox_width - $padding_left;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'bottom_left':
      $new_y = $height - $bbox_character_height * count($text_arr) - $padding_bottom + $bbox_character_height * 2;
      foreach ($text_arr as $text_arr_item) {
        $new_x = $padding_left;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'bottom_center':
      $new_y = $height - $bbox_character_height * count($text_arr) - $padding_bottom + $bbox_character_height * 2;
      foreach ($text_arr as $text_arr_item) {
        $new_x = ($width - $bbox_character_width * strlen($text_arr_item)) / 2;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    case 'bottom_right':
      $new_y = $height - $bbox_character_height * count($text_arr) - $padding_bottom + $bbox_character_height * 2;
      foreach ($text_arr as $text_arr_item) {
        $cur_bbox = imagettfbbox($size, 0, $font, $text_arr_item);
        $cur_bbox_width = abs($cur_bbox[2] - $cur_bbox[0]);
        $new_x = $width - $cur_bbox_width - $padding_left;
        imagettftext($image->resource, $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
        $new_y += $bbox_character_height;
      }
      break;
    default:
      $new_x = 0;
      $new_y = 0;
  }
  return TRUE;
}