2014-01-28 3 views
1

У меня есть код php для загрузки изображения и добавления водяного знака, но у меня есть небольшая проблема с выходом.upload image with watermark text

мой код успешный результат изображения с текстом водяного знака, как это: result 1

, но я хочу, выход, как это: result 2

это мой код:

function UploadImage($img_name){ 
    $vdir_upload = "img/upload/"; 
    $vfile_upload = $vdir_upload . $img_name; 
    $file_name = basename($_FILES["img_1"]["name"]); 
    move_uploaded_file($_FILES["img_1"]["tmp_name"], $vfile_upload); 

    switch (strtolower(pathinfo($file_name, PATHINFO_EXTENSION))) { 
      case "jpg" : 
       $im_src = imagecreatefromjpeg($vfile_upload); 
      break; 
      case "jpeg" : 
       $im_src = imagecreatefromjpeg($vfile_upload); 
      break; 
      case "gif" : 
       $im_src = imagecreatefromgif($vfile_upload); 
      break; 
      case "png" : 
       $im_src = imagecreatefrompng($vfile_upload); 
      break; 
      default : 
       trigger_error("Error Bad Extention"); 
       exit(); 
      break; 
    } 
    $src_width = imageSX($im_src); 
    $src_height = imageSY($im_src); 
    $dst_width = 1979; 
    $dst_height = ($dst_width/$src_width)*$src_height; 
    $im = imagecreatetruecolor($dst_width,$dst_height); 
    imagecopyresampled($im, $im_src, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height); 
    $font = 'Aliquam.ttf'; 
    $red = imagecolorallocate($im, 255, 0, 0); 
    imagettftext($im, 30, 0, 10, 50, $red, $font, $_POST["color"]); 
    imagejpeg($im,$vdir_upload . $_POST["number"].".jpg"); 
    imagedestroy($im_src); 
    imagedestroy($im); 
    } 

, как я могу получить результат, как указано выше? извините за мой плохой английский, спасибо заранее ...

+0

Взгляните на некоторые учебники в GD, нарисуйте прямоугольник, нарисовать текст сверху. – n00dle

ответ

1

Прежде всего - если вы хотите увеличить ширину изображения по краю, я бы взял оригинальную ширину изображения, добавив ширину вашего поля (позволяет называть его $ extraWidth и предполагать, что он определен где-то) и настроить ваш imagecreatetruecolor-вызов с новой шириной. Затем вы выделяете цвет и заполняете оставшееся пространство прямоугольником для вашего цвета, как показано ниже.

$im = imagecreatetruecolor($dst_width+$extraWidth, $dst_height); 
$color = imagecolorallocate($im, 0, 0, 255); // this is blue - change to what you want 
imagefilledrectangle($im, $dst_width, 0, $dst_width+$extraWidth, $dst_height, $color); 

Обратите внимание: я не тестировал этот код, просто ссылаясь на документацию.

$pixel_height_of_character = 30; // change this to actual pixel height of a char 
$pixel_gap_between_chars = 3; 
$start_from_edge_of_margin = 3; 
$string_chars = str_split($_POST['color']); 
$start = ($dst_height/2) - ((count($string_chars) * ($pixel_height_of_character+$pixel_gap_between_chars))/2) 
// probably should round this 
// also need to deduct one half of pixel gap from the result for centering purposes - i think - double check my math. 
$left = $start_from_edge_of_margin + $dst_width; 
foreach($string_chars as $char){ 
    $top = $start + $pixel_height_of_character; 
    imagettftext($im, 30, 0, $left, $top, $red, $font, $char); 
    $start = $top + $pixel_gap_between_chars; 
} 

So. Это немного объясняет.

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

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

Измененный код:

function UploadImage($img_name){ 
    $vdir_upload = "img/upload/"; 
    $vfile_upload = $vdir_upload . $img_name; 
    $file_name = basename($_FILES["img_1"]["name"]); 
    move_uploaded_file($_FILES["img_1"]["tmp_name"], $vfile_upload); 

    switch (strtolower(pathinfo($file_name, PATHINFO_EXTENSION))) { 
      case "jpg" : 
       $im_src = imagecreatefromjpeg($vfile_upload); 
      break; 
      case "jpeg" : 
       $im_src = imagecreatefromjpeg($vfile_upload); 
      break; 
      case "gif" : 
       $im_src = imagecreatefromgif($vfile_upload); 
      break; 
      case "png" : 
       $im_src = imagecreatefrompng($vfile_upload); 
      break; 
      default : 
       trigger_error("Error Bad Extention"); 
       exit(); 
      break; 
    } 
    $src_width = imageSX($im_src); 
    $src_height = imageSY($im_src); 
    $dst_width = 1979; 
    $dst_height = ($dst_width/$src_width)*$src_height; 
     $im = imagecreatetruecolor($dst_width+$extraWidth, $dst_height); 
     $color = imagecolorallocate($im, 0, 0, 255); // this is blue - change to what you want 
     imagefilledrectangle($im, $dst_width, 0, $dst_width+$extraWidth, $dst_height, $color); 
    imagecopyresampled($im, $im_src, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height); 
    $font = 'Aliquam.ttf'; 
    $red = imagecolorallocate($im, 255, 0, 0); 
    $pixel_height_of_character = 30; // change this to actual pixel height of a char 
    $pixel_gap_between_chars = 3; 
    $start_from_edge_of_margin = 3; 
    $string_chars = str_split($_POST['color']); 
    $start = ($dst_height/2) - ((count($string_chars) * ($pixel_height_of_character+$pixel_gap_between_chars))/2) 
    // probably should round this 
    // also need to deduct one half of pixel gap from the result for centering purposes - i think - double check my math. 
    $left = $start_from_edge_of_margin + $dst_width; 
    foreach($string_chars as $char){ 
     $top = $start + $pixel_height_of_character; 
     imagettftext($im, 30, 0, $left, $top, $red, $font, $char); 
     $start = $top + $pixel_gap_between_chars; 
    } 
    imagejpeg($im,$vdir_upload . $_POST["number"].".jpg"); 
    imagedestroy($im_src); 
    imagedestroy($im); 
    } 
+0

thx для вашего ответа, это работа для меня .. –

0
class Watermark { 
/** 
* 
* @var image resource 
*/ 
private $image = null; 

/** 
* 
* @var image resource 
*/ 
private $watermark = null; 

/** 
* 
* @var string 
*/ 
private $output_file = null; 

/** 
* 
* @var int 
*/ 
private $type = ''; 


const BOTTOM_RIGHT = 1; 
const CENTER = 2; 
const BOTTOM_RIGHT_SMALL = 3; 

/** 
* 
* @param string $path_to_image 
*/ 
public function __construct($path_to_image = ''){ 
    if (file_exists($path_to_image)){ 
     $this->image = $path_to_image; 
    } 
    $this->type = Watermark::BOTTOM_RIGHT; 
} 

/** 
* 
* @param string $path_to_watermark 
* @return boolean 
*/ 
public function setWatermarkImage($path_to_watermark){ 
    if (file_exists($path_to_watermark) && preg_match('/\.png$/i',$path_to_watermark)){ 
     $this->watermark = $path_to_watermark; 
     return true; 
    } 
    return false; 
} 

/** 
* 
* @return boolean 
*/ 
public function save(){ 
    $this->output_file = $this->image; 
    return $this->process(); 
} 

/** 
* 
* @param string $path_to_image 
* @return boolean 
*/ 
public function saveAs($path_to_image){ 
    $this->output_file = $path_to_image; 
    return $this->process(); 
} 

/** 
* 
* @param int $type 
*/ 
public function setType($type){ 
    $this->type = $type; 
} 

/** 
* 
* @return boolean 
*/ 
private function process(){ 
    $watermark = imagecreatefrompng($this->watermark); 
    if ($watermark){ 
     $image = imagecreatefromjpeg($this->image); 
     if ($image){ 
      switch ($this->type){ 
       case Watermark::BOTTOM_RIGHT: 
        return $this->watermark_bottom_right($image, $watermark); 
        break; 
       case Watermark::CENTER: 
        return $this->watermark_center($image, $watermark); 
        break; 
       case Watermark::BOTTOM_RIGHT_SMALL: 
        return $this->watermark_bottom_right_small($image, $watermark); 
        break; 
      } 
      return true; 
     }else{ 
      return false; 
     } 
    }else { 
     return false; 
    } 
} 

/** 
* 
* @param image resource $image 
* @param image resource $watermark 
* @return boolean 
*/ 
private function watermark_bottom_right(&$image, &$watermark){ 
    $watermark_width = imagesx($watermark); 
    $watermark_height = imagesy($watermark); 
    $size = getimagesize($this->image); 
    $dest_x = $size[0] - $watermark_width - 5; 
    $dest_y = $size[1] - $watermark_height - 5; 
    imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); 

    imagejpeg($image,$this->output_file,100); 
    imagedestroy($image); 
    imagedestroy($watermark); 
    return true; 
} 

/** 
* 
* @param image resource $image 
* @param image resource $watermark 
* @return booelan 
*/ 
private function watermark_center(&$image, &$watermark){ 
    $size = getimagesize($this->image); 
    $watermark_x = imagesx($watermark); 
    $watermark_y = imagesy($watermark); 
    $im_x = $size[0]; 
    $im_y = $size[1]; 
    $cof = $im_x/($watermark_x*1.3); // 5/1 = im_x/(wx*cof) ; wx*cof = im_x/5 ; cof = im_x/wx*5 
    $w = intval($watermark_x*$cof); 
    $h = intval($watermark_y*$cof); 

    $watermark_mini = ImageCreateTrueColor($w, $h); 
    imagealphablending($watermark_mini, false); 
    imagesavealpha($watermark_mini,true); 
    ImageCopyResampled ($watermark_mini, $watermark, 0, 0, 0, 0, $w, $h, $watermark_x, $watermark_y); 


    $dest_x = $im_x - $w - (($im_x-$w)/2); 
    $dest_y = $im_y - $h - (($im_y-$h)/2); 

    imagecopy($image, $watermark_mini, $dest_x, $dest_y, 0, 0, $w, $h); 

    imagejpeg($image,$this->output_file,100); 
    imagedestroy($image); 
    imagedestroy($watermark); 
    return true; 
} 

/** 
* 
* @param image resource $image 
* @param image resource $watermark 
* @return boolean 
*/ 
private function watermark_bottom_right_small(&$image, &$watermark){ 
    $size = getimagesize($this->image); 
    $orig_watermark_x = imagesx($watermark); 
    $orig_watermark_y = imagesy($watermark); 
    $im_x = $size[0]; 
    $im_y = $size[1]; 
    $cof = $im_x/($orig_watermark_x*5); // 5/1 = im_x/(wx*cof) ; wx*cof = im_x/5 ; cof = im_x/wx*5 
    $w = intval($orig_watermark_x*$cof); 
    $h = intval($orig_watermark_y*$cof); 

    $watermark_mini = ImageCreateTrueColor($w, $h); 
    imagealphablending($watermark_mini, false); 
    imagesavealpha($watermark_mini,true); 
    ImageCopyResampled ($watermark_mini, $watermark, 0, 0, 0, 0, $w, $h, $orig_watermark_x, $orig_watermark_y); 
    // 
    $dest_x = $size[0] - $w - 5; 
    $dest_y = $size[1] - $h -5; 

    imagecopy($image, $watermark_mini, $dest_x,$dest_y , 0, 0, $w, $h); 
    imagejpeg($image,$this->output_file,100); 
    imagedestroy($image); 
    imagedestroy($watermark); 
    imagedestroy($watermark_mini); 
    return true; 
} 
} 

использование

$watermark = new Watermark('file_path.jpg'); 
$watermark->setWatermarkImage('watermark_path.png'); 
$watermark->setType(Watermark::CENTER); 
$watermark->saveAs('file_path.jpg');