2012-04-29 1 views
1

В настоящее время я использую библиотеку GD php для масштабирования некоторых изображений в стиле почтового ящика и заполняю полученное пустое пространство цветом черного цвета. Однако мне нужно заполнить пустое пространство, используя шаблон, который у меня есть в другом файле изображения. Есть идеи, как это сделать?Letterbox Изображение и заполнение пустым пространством с другим изображением

Это код, я использую для масштабирования изображения:

function resize_image($source_image, $destination_width, $destination_height, $type = 0) { 
    // $type (1=crop to fit, 2=letterbox) 
    $source_width = imagesx($source_image); 
    $source_height = imagesy($source_image); 
    $source_ratio = $source_width/$source_height; 
    $destination_ratio = $destination_width/$destination_height; 
    if ($type == 1) { 
     // crop to fit 
     if ($source_ratio > $destination_ratio) { 
      // source has a wider ratio 
      $temp_width = (int)($source_height * $destination_ratio); 
      $temp_height = $source_height; 
      $source_x = (int)(($source_width - $temp_width)/2); 
      $source_y = 0; 
     } else { 
      // source has a taller ratio 
      $temp_width = $source_width; 
      $temp_height = (int)($source_width/$destination_ratio); 
      $source_x = 0; 
      $source_y = (int)(($source_height - $temp_height)/2); 
     } 
     $destination_x = 0; 
     $destination_y = 0; 
     $source_width = $temp_width; 
     $source_height = $temp_height; 
     $new_destination_width = $destination_width; 
     $new_destination_height = $destination_height; 
    } else { 
     // letterbox 
     if ($source_ratio < $destination_ratio) { 
      // source has a taller ratio 
      $temp_width = (int)($destination_height * $source_ratio); 
      $temp_height = $destination_height; 
      $destination_x = (int)(($destination_width - $temp_width)/2); 
      $destination_y = 0; 
     } else { 
      // source has a wider ratio 
      $temp_width = $destination_width; 
      $temp_height = (int)($destination_width/$source_ratio); 
      $destination_x = 0; 
      $destination_y = (int)(($destination_height - $temp_height)/2); 
     } 
     $source_x = 0; 
     $source_y = 0; 
     $new_destination_width = $temp_width; 
     $new_destination_height = $temp_height; 
    } 
    $destination_image = imagecreatetruecolor($destination_width, $destination_height); 
    if ($type > 1) { 
     imagefill($destination_image, 0, 0, imagecolorallocate($destination_image, 0, 0, 0)); 
    } 
    imagecopyresampled($destination_image, $source_image, $destination_x, $destination_y, $source_x, $source_y, $new_destination_width, $new_destination_height, $source_width, $source_height); 
    return $destination_image; 
} 

Thank You

EDIT ------------------

Я теперь использую этот код, который прекрасно работает, использует методы, предложенные ниже:

 $destination_image = imagecreatetruecolor($destination_width, $destination_height); 

    if ($type > 1) { 
     if ($pattern != NULL) { 
      $pattern = imagecreatefrompng($pattern); 
      imagesettile($destination_image, $pattern); 
      imagefill($destination_image, 0, 0, IMG_COLOR_TILED); 
     } else { 
      imagefill($destination_image, 0, 0, imagecolorallocate($destination_image, 0, 0, 0)); 
     } 
    } 
    imagecopyresampled($destination_image, $source_image, $destination_x, $destination_y, $source_x, $source_y, $new_destination_width, $new_destination_height, $source_width, $source_height); 
    return $destination_image; 

$ шаблон представляет собой путь к файлу фона я маг, чтобы заполнить почтовый ящик!

+0

Я угадываю, оглядываясь вокруг, что хочу использовать что-то вроде imagecopyresampled, но я не уверен, как я это сделаю. – Nath5

ответ

0

Сначала подготовьте фон с imagesettile(), чтобы создать плиточный холст для наложения вашего почтового ящика на, а затем скопировать Letterboxed части изображения этого ресурс с помощью source_x/Y/W параметров/ч imagecopy() или imagecopyresampled().

+0

Спасибо, я прочитаю эти методы и посмотрю, смогу ли я это понять! – Nath5