Problema de carga y cambio de tamaño de CodeIgniter

He pasado días tratando de hacer que esto funcione basado en los ejemplos en la documentación, pero me falta algo o simplemente soy ESTÚPIDO

Tengo una aplicación CMS donde los usuarios cargan una imagen para mostrarla en un diseño muy fijo. No queremos limitar el tamaño del archivo de la imagen cargada, sino que preferimos "procesarlo" después de que llegue.

La imagen debe tener un ancho de 615 px, pero algunas de las imágenes cargadas directamente desde cámaras digitales son 2500X2000 y más grandes, por lo que es CRÍTICO.

Reuní el código del manual y la imagen se está cargando con éxito en una carpeta dentro de la aplicación CMS. Sin embargo, NO se cambiará el tamaño de la imagen.

Si alguna vez consigo cambiar el tamaño, mi plan es presentar la imagen al usuario para que la recorte usando jCrop (la imagen final TIENE que ser 615X275 y probablemente deba recortarse para la altura después de cambiar el tamaño) y luego usar codeigniter a FTP la imagen en la carpeta de servicios de su sitio con el nombre original.

¡Agradeceré cualquier ayuda en este asunto!

Aquí está mi código:

función do_feature_upload () {$ imageName = $ this-> uri-> segmento (3); // echo $ imageName; // Dónde se colocará el archivo $ config ['upload_path'] = "./uploads/".$_SESSION['dbPropNumber ']; $ config ['tipos_permitidos'] = 'jpg | jpeg'; $ config ['max_size'] = '0'; $ config ['nombre_archivo'] = $ nombre_imagen. '. jpg'; $ config ['sobreescribir'] = 'VERDADERO'; $ this-> load-> library ('cargar', $ config); if (! $ this-> upload-> do_upload ()) {$ error = array ('error' => $ this-> upload-> display_errors ()); $ error ['propertyDropdown'] = $ _SESSION ['propertyDropdown']; $ error ['nombre de usuario'] = $ _SESSION ['nombre de usuario']; $ 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,' keep_ratio '=> FALSE,' width ' => $ newWidth, 'altura' => $ newHeight); $ this-> load-> library ('image_lib', $ resize); $ this-> image_lib-> resize (); $ data = array ('upload_data' => $ this-> upload-> data ()); $ datos ['propertyDropdown'] = $ _SESSION ['propertyDropdown']; $ datos ['nombre de usuario'] = $ _SESSION ['nombre de usuario']; $ datos ['dbPropNumber'] = $ _SESSION ['dbPropNumber']; $ data ['propertyName'] = $ this-> content-> getPropertyName ($ _ SESSION ['dbPropNumber']); // Presentar la opción jCrop después de cambiar el tamaño de la imagen // FTP al destino final $ this-> load-> view ('upload_success', $ data); } // finaliza si} // finaliza la función

preguntado el 01 de diciembre de 10 a las 13:12

intente eliminar base_url () en la función de cambio de tamaño. Si soy correcto, las rutas (source_image y new_image) tienen que ser relativas, no absolutas. -

¡¡¡¡TRABAJADO COMO UN ENCANTO!!!! ¡¡¡GRACIAS!!! -

2 Respuestas

No estoy del todo seguro de qué está fallando con su código, pero aquí hay una función de modelo que escribí para cambiar el tamaño de las imágenes para que se ajusten a una altura de destino exacta y ancho objetivo. Léalo y vea si no puede encontrar la solución.

$this->prefix es una propiedad de mi clase que utilizo, por lo que no tengo que seguir escribiendo el directorio del archivo. Se parece a esto:

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

Redimensionador de imagen

/**
 * 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");
    }
}

Respondido el 01 de diciembre de 10 a las 17:12

así que debería poner esto en el modelo y llamarlo así: $ this-> content-> resizeImageToDimensions ($ image_data ['$ image_data [' full_path '],'], $ newWidth, $ newHeight); - jgravois

Algo así, excepto para asegurarse de que la ruta de la imagen esté apuntando al lugar correcto (puede ser necesario realizar algunos retoques para que funcione correctamente). No es realmente necesario mantener esto en un modelo, per se, pero es la forma en que me gusta organizar las cosas (por lo general, adopto un enfoque holístico de MVC ... todo lo relacionado con el almacenamiento / manipulación de datos / archivos va en el modelo). No hay una razón real por la que esto no pueda ser solo su propia biblioteca o una extensión en image_lib. Lo que funcione mejor para ti. Pero sí, es mejor mantener esto fuera del controlador porque en todos los casos debe tener controladores delgados. - cara de árbol

Tuve el mismo problema hace unos meses y, lamentablemente, no pude resolverlo. He publicado la misma pregunta aquí y en Foros de CodeIgniter pero nadie pudo ayudarme.

Terminé usando timthumb script, que es genial, pero no es ideal :(

Por lo tanto, si tiene prisa, le recomiendo encarecidamente que use timthumb. Si tienes algo de tiempo para invertir en él, te deseo lo mejor y por favor, ¡compártelo!

contestado el 23 de mayo de 17 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.