2014-10-21 2 views
0

Я пытаюсь обрезать изображение, когда оно было загружено. Пока мне удалось изменить его размер, но если изображение представляет собой прямоугольную форму, изображение будет сжато, что не выглядит красивым. Я пытаюсь получить кодировку, которую я могу использовать с функцией, которую я сейчас должен изменить. Те, что я вижу, я должен изменить свою функцию, и я надеюсь не делать этого.Обрезка изображения с использованием php

Вот моя функция

function createThumbnail($filename) { 
    global $_SITE_FOLDER; 
    //require 'config.php'; 
    $final_width_of_image = 82; 
    $height = 85; 
    $path_to_image_directory = $_SITE_FOLDER.'portfolio_images/'; 
    $path_to_thumbs_directory = $_SITE_FOLDER.'portfolio_images/thumbs/'; 

    if(preg_match('/[.](jpg)$/', $filename)) { 
     $im = imagecreatefromjpeg($path_to_image_directory . $filename); 
    } else if (preg_match('/[.](gif)$/', $filename)) { 
     $im = imagecreatefromgif($path_to_image_directory . $filename); 
    } else if (preg_match('/[.](png)$/', $filename)) { 
     $im = imagecreatefrompng($path_to_image_directory . $filename); 
    } 

    $ox = imagesx($im); 
    $oy = imagesy($im); 

    $nx = $final_width_of_image; 
    $ny = floor($oy * ($final_width_of_image/$ox)); 
    //$ny = $height; 

    $nm = imagecreatetruecolor($nx, $ny); 

    imagecopyresized($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy); 



    if(!file_exists($path_to_thumbs_directory)) { 
     if(!mkdir($path_to_thumbs_directory)) { 
      die("There was a problem. Please try again!"); 
     } 
     } 

    imagejpeg($nm, $path_to_thumbs_directory . $filename); 
    $tn = '<img src="' . $path_to_thumbs_directory . $filename . '" alt="image" />'; 
    $tn .= '<br />Congratulations. Your file has been successfully uploaded, and a  thumbnail has been created.'; 
    echo $tn; 
} 
+0

В последнее время я начал думать, что использование уже существующих библиотек для выполнения конкретной работы сэкономило мне время. Вы знаете о воображении? вашему веб-хосту, возможно, придется установить его на свой сервер, чтобы вы могли его использовать, но посмотрите ему http://php.net/manual/en/book.imagick.php –

ответ

0

Вот моя функция.

<?php 
    function crop($file_input, $file_output, $crop = 'square',$percent = false) { 
     list($w_i, $h_i, $type) = getimagesize($file_input); 
     if (!$w_i || !$h_i) { 
      echo 'Unable to get the length and width of the image'; 
      return; 
      } 
      $types = array('','gif','jpeg','png'); 
      $ext = $types[$type]; 
      if ($ext) { 
        $func = 'imagecreatefrom'.$ext; 
        $img = $func($file_input); 
      } else { 
        echo 'Incorrect file format'; 
      return; 
      } 
     if ($crop == 'square') { 
      $min = $w_i; 
      if ($w_i > $h_i) $min = $h_i; 
      $w_o = $h_o = $min; 
     } else { 
      list($x_o, $y_o, $w_o, $h_o) = $crop; 
      if ($percent) { 
       $w_o *= $w_i/100; 
       $h_o *= $h_i/100; 
       $x_o *= $w_i/100; 
       $y_o *= $h_i/100; 
      } 
        if ($w_o < 0) $w_o += $w_i; 
       $w_o -= $x_o; 
      if ($h_o < 0) $h_o += $h_i; 
      $h_o -= $y_o; 
     } 
     $img_o = imagecreatetruecolor($w_o, $h_o); 
     imagecopy($img_o, $img, 0, 0, $x_o, $y_o, $w_o, $h_o); 
     if ($type == 2) { 
      return imagejpeg($img_o,$file_output,100); 
     } else { 
      $func = 'image'.$ext; 
      return $func($img_o,$file_output); 
     } 
    } 
    ?> 

А вы можете назвать как этот

crop($file_input, $file_output, $crop = 'square',$percent = false); 

А также изменить размер функции, если вам нужно.

<?php 
function resize($file_input, $file_output, $w_o, $h_o, $percent = false) { 
    list($w_i, $h_i, $type) = getimagesize($file_input); 
    if (!$w_i || !$h_i) { 
     return; 
     } 
     $types = array('','gif','jpeg','png'); 
     $ext = $types[$type]; 
     if ($ext) { 
       $func = 'imagecreatefrom'.$ext; 
       $img = $func($file_input); 
     } else { 
     return; 
     } 
    if ($percent) { 
     $w_o *= $w_i/100; 
     $h_o *= $h_i/100; 
    } 
    if (!$h_o) $h_o = $w_o/($w_i/$h_i); 
    if (!$w_o) $w_o = $h_o/($h_i/$w_i); 

    $img_o = imagecreatetruecolor($w_o, $h_o); 
    imagecopyresampled($img_o, $img, 0, 0, 0, 0, $w_o, $h_o, $w_i, $h_i); 
    if ($type == 2) { 
     return imagejpeg($img_o,$file_output,100); 
    } else { 
     $func = 'image'.$ext; 
     return $func($img_o,$file_output); 
    } 
} 
?> 

resize($file_input, $file_output, $w_o, $h_o, $percent = false); 
0

Вы можете использовать SimpleImage класс найден здесь SimpleImage

[править] Обновленная версия с гораздо больше возможностей здесь SimleImage Updated

я использую это при изменении размеров различных изображений меньшего размера миниатюр при сохранении соотношения сторон и точный размер изображения. Я заполняю пустую область цветом, который соответствует фону для места размещения изображения, этот класс поддерживает обрезку. Изучите методы cutFromCenter и maxareafill.

Например, в вашем коде вам не нужно будет imagecreatefromjpeg() вы бы просто;

Включить класс include('SimpleImage.php');

тогда;

$im = new SimpleImage(); 
$im->load($path_to_image_directory . $filename); 
$im->maxareafill($output_width,$output_height, 0,0,0); // rgb 
$im->save($path_to_image_directory . $filename); 

Я использую этот класс ежедневно и нахожу его очень универсальным.