CodeIgniter Загрузка и изменение размера проблемы - PullRequest
3 голосов
/ 01 декабря 2010

Я потратил несколько дней, пытаясь заставить это работать на основе примеров в документации, но я что-то упустил, или я просто тупой!

У меня есть приложение 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

Ответы [ 2 ]

7 голосов
/ 01 декабря 2010

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

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

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

Изменение размера изображения

/**
 * 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 голос
/ 01 декабря 2010

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

В итоге я использовал скрипт timthumb это здорово, но далеко не идеально: (

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

...