Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CodeIgniter Upload and Resize Problem

I have spent days trying to make this work based on the examples in the documentation but I am missing something or I am just STUPID!

I have a CMS application where users upload an image for display in a very fixed layout. We do not want to limit the file size of the uploaded image but would rather "process" it after it arrives.

The image needs to be 615px wide but some of the images uploaded directly from digital cameras are 2500X2000 and bigger so this is CRITICAL.

I pieced together the code from the manual and the image is successfully being uploaded to a folder within the CMS app. However, the image is NOT being resized.

If I ever get it to re-size, my plan is to present the image to the user for cropping using jCrop (the final image HAS to be 615X275 and it probably has to be cropped for height after resizing) and then use codeigniter to FTP the image to their site's amenities folder using the original name.

I will appreciate any help in this matter!

Here's my code:

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
like image 929
jgravois Avatar asked Feb 26 '23 17:02

jgravois


1 Answers

I'm not entirely sure what's going wrong with your code, but here's a model function I wrote for resizing images to fit an exact target height and target width. Read through it and see if you can't figure out the solution.

$this->prefix is a property in my class that I use so I don't have to keep writing out the directory of the file. It looks like this:

$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");
    }
}
like image 154
treeface Avatar answered Mar 24 '23 03:03

treeface