2015-04-04 4 views
1

У меня есть функция, которая загружает файлы до 8 МБ, но теперь я также хочу сжать или, по крайней мере, перемасштабировать большие изображения, поэтому мое выходное изображение не будет больше 100-200 КБ и разрешение 1000х1000 пикселей , Как я могу реализовать сжатие и масштабирование (пропорциональное) в моей функции?Сжатие и RESCALE Загруженное изображение

function uploadFile($file, $file_restrictions = '', $user_id, $sub_folder = '') { 
    global $path_app; 
    $new_file_name = generateRandomString(20); 

    if($sub_folder != '') { 
     if(!file_exists('media/'.$user_id.'/'.$sub_folder.'/')) { 
      mkdir('media/'.$user_id.'/'.$sub_folder, 0777); 
     } 
     $sub_folder = $sub_folder.'/'; 
    } 
    else { 
     $sub_folder = ''; 
    } 

    $uploadDir = 'media/'.$user_id.'/'.$sub_folder; 
    $uploadDirO = 'media/'.$user_id.'/'.$sub_folder; 
    $finalDir = $path_app.'/media/'.$user_id.'/'.$sub_folder; 

    $fileExt = explode(".", basename($file['name'])); 
    $uploadExt = $fileExt[count($fileExt) - 1]; 
    $uploadName = $new_file_name.'_cache.'.$uploadExt; 
    $uploadDir = $uploadDir.$uploadName; 

    $restriction_ok = true; 
    if(!empty($file_restrictions)) { 
     if(strpos($file_restrictions, $uploadExt) === false) { 
      $restriction_ok = false; 
     } 
    } 
    if($restriction_ok == false) { 
     return ''; 
    } 
    else { 
     if(move_uploaded_file($file['tmp_name'], $uploadDir)) { 
      $image_info  = getimagesize($uploadDir); 
      $image_width = $image_info[0]; 
      $image_height = $image_info[1]; 

      if($file['size'] > 8000000) { 
       unlink($uploadDir); 
       return ''; 
      } 
      else { 
       $finalUploadName = $new_file_name.'.'.$uploadExt; 
       rename($uploadDirO.$uploadName, $uploadDirO.$finalUploadName); 

       return $finalDir.$finalUploadName; 
      } 
     } 
     else { 
      return ''; 
     } 
    } 
} 

ответ

1

Для перемасштабирования я использую такую ​​функцию:

function dimensions($width,$height,$maxWidth,$maxHeight) 
// given maximum dimensions this tries to fill that as best as possible 
{ 
    // get new sizes 
    if ($width > $maxWidth) { 
    $height = Round($maxWidth*$height/$width); 
    $width = $maxWidth; 
    } 
    if ($height > $maxHeight) { 
    $width = Round($maxHeight*$width/$height); 
    $height = $maxHeight; 
    } 
    // return array with new size 
    return array('width' => $width,'height' => $height); 
} 

Сжатие делается с помощью функции PHP:

// set limits 
    $maxWidth = 1000; 
    $maxHeight = 1000; 
    // read source 
    $source = imagecreatefromjpeg($originalImageFile); 
    // get the possible dimensions of destination and extract 
    $dims = dimensions(imagesx($source),imagesy($source),$maxWidth,$maxHeight); 
    // prepare destination 
    $dest = imagecreatetruecolor($dims['width'],$dims['height']); 
    // copy in high-quality 
    imagecopyresampled($dest,$source,0,0,0,0, 
        $width,$height,imagesx($source),imagesy($source)); 
    // save file 
    imagejpeg($dest,$destinationImageFile,85); 
    // clear both copies from memory 
    imagedestroy($source); 
    imagedestroy($dest); 

Вы должны будете поставлять $originalImageFile и $destinationImageFile. Этот материал происходит из класса, который я использую, поэтому я отредактировал его довольно много, но основная функциональность есть. Я не проверял ошибок, поэтому вам все равно нужно добавить это. Обратите внимание, что 85 в imagejpeg() обозначает количество сжатия.

0

Посмотрите на imagecopyresampled(), Существует также пример того, как осуществить это, для сжатия посмотрите на imagejpeg() третий параметр помогает установить качество изображения, 100 средство (наилучшее качество, наибольший файл), и если вы пропустите последний вариант, тогда качество по умолчанию - 75, что хорошо и сжимает его.

1

вы можете использовать простое решение одной линии через imagemagic library команда будет, как это

$image="path to image"; 
$res="option to resize"; i.e 25% small , 50% small or anything else 
exec("convert ".$image." -resize ".$res." ".$image); 

с этим вы можете вращатьразмер и многие другие настройки изображения

+0

Хорошее решение, но я только есть веб-сервер, нет root или vroot - но все равно спасибо! – Maxi

+0

нормально проблем нет. вы нашли свой ответ, это важно. это может помочь другому лицу – MKD

Смежные вопросы