2010-12-01 3 views
3

Я потратил дни, пытаясь сделать эту работу на основе примеров в документации, но мне что-то не хватает, или я просто STUPID!CodeIgniter Загрузить и изменить размер Проблема

У меня есть приложение CMS, где пользователи загружают изображение для отображения в очень фиксированном макете. Мы не хотим ограничивать размер файла загруженного изображения, но скорее «обработаем» его после его поступления.

Изображение должно быть шириной 615 пикселей, но некоторые изображения, загружаемые непосредственно с цифровых камер, - 2500X2000 и более, поэтому это КРИТИЧЕСКИЙ.

Я скопировал код из руководства, и изображение успешно загружается в папку в приложении CMS. Однако изображение НЕ изменяется.

Если я когда-либо получил его, чтобы изменить размер, мой план состоит в том, чтобы представить изображение пользователю для обрезки с помощью jCrop (окончательное изображение должно быть 615X275, и, возможно, его нужно обрезать по высоте после изменения размера), а затем используйте codeigniter для FTP-изображения в папку с удобствами своего сайта, используя оригинальное имя.

Буду признателен за любую помощь в этом вопросе!

Вот мой код:

 
function do_feature_upload() { 
     $imageName = $this->uri->segment(3); 
     //echo $imageName; 

     // Where the file is going to be placed 
     $config['upload_path'] = "./uploads/".$_SESSION['dbPropNumber']; 
     $config['allowed_types'] = 'jpg|jpeg'; 
     $config['max_size'] = '0'; 
     $config['file_name'] = $imageName.'.jpg'; 
     $config['overwrite'] = 'TRUE'; 

     $this->load->library('upload', $config); 

     if (! $this->upload->do_upload()) { 
      $error = array('error' => $this->upload->display_errors()); 

      $error['propertyDropdown'] = $_SESSION['propertyDropdown']; 
      $error['username'] = $_SESSION['username']; 
      $error['dbPropNumber'] = $_SESSION['dbPropNumber']; 
      $error['propertyName'] = $this->content->getPropertyName($_SESSION['dbPropNumber']); 

      $this->load->view('upload_AmenityImage', $error); 
     } else { 
      $image_data = $this->upload->data(); 

      $origWidth = $image_data['image_width']; 
      $origHeight = $image_data['image_height']; 
      $newWidth = 615; 
      $newHeight = $newWidth*$origHeight/$origWidth; 

      $resize = array(
       'image_library'=>'gd2', 
       'source_image'=>base_url().'uploads/'.$_SESSION['dbPropNumber'].'/'.$imageName.'.jpg', 
       'new_image'=>base_url().'uploads/'.$_SESSION['dbPropNumber'].'/'.$imageName.'1.jpg', 
       'create_thumb' => FALSE, 
       'maintain_ratio'=>FALSE, 
       'width'=>$newWidth, 
       'height'=>$newHeight 
      ); 

      $this->load->library('image_lib',$resize); 
      $this->image_lib->resize(); 

      $data = array('upload_data' => $this->upload->data()); 
      $data['propertyDropdown'] = $_SESSION['propertyDropdown']; 
      $data['username'] = $_SESSION['username']; 
      $data['dbPropNumber'] = $_SESSION['dbPropNumber']; 
      $data['propertyName'] = $this->content->getPropertyName($_SESSION['dbPropNumber']); 

      //Present jCrop option after image is resized 

      // FTP to final destination 

      $this->load->view('upload_success', $data); 
     } // end if 
    } // end function 
+0

попытайтесь удалить base_url() в функции изменения размера. Если я правильный путь (source_image и new_image) должен быть относительным не абсолютным. – trix 2010-12-01 17:51:47

+0

РАБОТАЕТ КАК ОЧАРОВАТЬ! !!! THANKS !!! – jgravois 2010-12-01 18:02:39

ответ

6

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

$this->prefix - свойство в моем классе, которое я использую, поэтому мне не нужно записывать каталог файла. Это выглядит следующим образом:

$this->prefix = FCPATH.'uploads'.DIRECTORY_SEPARATOR;

Image Resizer

/** 
* Resizes an image to fit exact dimensions 
* 
* @param string filename 
* @param int  target_width 
* @param int  target_height 
* 
* @return array('success' ? null : 'error') 
*/ 
function resizeImageToDimensions($filename, $target_width=700, $target_height=399) 
{ 
    $file_type = $this->getFileType($this->prefix.$filename); 

    if (!$file_type || $file_type != 'image') 
     return array('success'=>false, 'error'=>"This file doesn't exist or isn't an image"); 

    $this->load->library('image_lib'); 

    list($width, $height) = getimagesize($this->prefix.$filename); 
    $current_ratio = $width/$height; 
    $target_ratio = $target_width/$target_height; 
    $config['source_image'] = $this->prefix.$filename; 

    if ($current_ratio > $target_ratio) 
    { 
     //resize first to height, maintain ratio 
     $config['height'] = $target_height; 
     $config['width'] = $target_height * $current_ratio; 
     $this->image_lib->initialize($config); 

     if (!$this->image_lib->resize()) 
      return array('success'=>false, 'error'=>"There was an error while resizing this image"); 

     //then crop off width 
     $config['width'] = $target_width; 
     $config['maintain_ratio'] = false; 
     $this->image_lib->initialize($config); 

     if ($this->image_lib->crop()) 
      return array('success'=>true); 
     else 
      return array('success'=>false, 'error'=>"There was an error while cropping this image"); 
    } 
    else if ($current_ratio < $target_ratio) 
    { 
     //resize first to width, maintain ratio 
     $config['width'] = $target_width; 
     $config['height'] = $target_width/$current_ratio; 
     $this->image_lib->initialize($config); 

     if (!$this->image_lib->resize()) 
      return array('success'=>false, 'error'=>"There was an error while resizing this image"); 

     //then crop off height 
     $config['height'] = $target_height; 
     $config['maintain_ratio'] = false; 
     $this->image_lib->initialize($config); 

     if ($this->image_lib->crop()) 
      return array('success'=>true); 
     else 
      return array('success'=>false, 'error'=>"There was an error while cropping this image"); 
    } 
    else { 
     $config['width'] = $target_width; 
     $config['height'] = $target_height; 
     $this->image_lib->initialize($config); 

     if ($this->image_lib->resize()) 
      return array('success'=>true); 
     else 
      return array('success'=>false, 'error'=>"There was an error while resizing this image"); 
    } 
} 
1

У меня была та же проблема несколько месяцев назад и, к сожалению, я не был в состоянии понять это. Я отправил тот же вопрос here и в CodeIgniter's forums, но никто не мог мне помочь.

Я закончил с использованием timthumb скрипт, который является большим, но далеко не идеал :(

Так что, если вы в спешке, я настоятельно рекомендую использовать timthumb. Если у вас есть некоторое время, чтобы инвестировать на нем, я желаю вам всего наилучшего и, пожалуйста, поделитесь!