thumbnail libreria images imagenes imagen image_lib files create php codeigniter image-resizing

libreria - redimensionar la imagen antes de cargarla en CodeIgniter PHP



libreria image_lib (2)

Estoy teniendo el siguiente bloque de código en mi función:

$target_path = "uploads/"; $target_path = $target_path . basename( $_FILES[''image''][''name'']); if(move_uploaded_file($_FILES[''image''][''tmp_name''], $target_path)) { echo "The file ". basename( $_FILES[''image''][''name''])." has been uploaded"; } else { echo "There was an error uploading the file, please try again!"; }

Ahora quiero cambiar el tamaño de la imagen antes de subirla. Estoy usando el framework CodeIgniter. Tengo este código:

$config[''upload_path''] = "uploads/"; $path=$config[''upload_path'']; $config[''overwrite''] = FALSE; $config[''remove_spaces''] = TRUE; $config[''allowed_types''] = ''gif|jpg|jpeg|png|JPEG|JPG|PNG''; $config[''max_size''] = ''1024''; $config[''maintain_ratio''] = TRUE; $config[''max_width''] = ''1000''; $config[''max_height''] = ''1000''; $this->load->library(''upload'',$config);

Pero esto no está funcionando correctamente. Estoy buscando una buena solución donde la imagen se cargue por mi altura y ancho especificados.


Esta es la función que uso para permitir que nuestro personal cargue imágenes de productos, carga la imagen de tamaño completo y dos imágenes más pequeñas (solo incluí el código de una aquí, la versión tn_). Toma los valores que tiene porque está en mi controlador y puede ser llamado desde múltiples lugares. $ control es el nombre del control fileUpload que está utilizando, $ path es la ruta de guardado, $ imageName es el del control y los tamaños solo me permiten especificar qué versiones hacer, en mi caso recibe todo, med y tn como opciones Puede hacer tantas o tan pocas como necesite. Como VDP mencionó, estás limitado a menos de 2 MB si no cambias ninguna configuración, pero eso está bien para mí, así que simplemente devuelvo un error si ya pasó.

No utilizo la biblioteca de carga de imágenes de CI en absoluto. Simplemente se envía al controlador a través de una carga normal de archivos y ajax. Utiliza un iframe en la vista principal para mostrar los errores o el éxito.

La función de carga de mi controlador:

function doUpload($control, $path, $imageName, $sizes) { if( ! isset($_FILES[$control]) || ! is_uploaded_file($_FILES[$control][''tmp_name''])) { print(''No file was chosen''); return FALSE; } if($_FILES[$control][''size'']>2048000) { print(''File is too large (''.round(($_FILES[$control]["size"]/1000)).''kb), please choose a file under 2,048kb''); return FALSE; } if($_FILES[$control][''error''] !== UPLOAD_ERR_OK) { print(''Upload failed. Error code: ''.$_FILES[$control][''error'']); Return FALSE; } switch(strtolower($_FILES[$control][''type''])) { case ''image/jpeg'': $image = imagecreatefromjpeg($_FILES[$control][''tmp_name'']); move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName); break; case ''image/png'': $image = imagecreatefrompng($_FILES[$control][''tmp_name'']); move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName); break; case ''image/gif'': $image = imagecreatefromgif($_FILES[$control][''tmp_name'']); move_uploaded_file($_FILES[$control]["tmp_name"],$path.$imageName); break; default: print(''This file type is not allowed''); return false; } @unlink($_FILES[$control][''tmp_name'']); $old_width = imagesx($image); $old_height = imagesy($image); //Create tn version if($sizes==''tn'' || $sizes==''all'') { $max_width = 100; $max_height = 100; $scale = min($max_width/$old_width, $max_height/$old_height); if ($old_width > 100 || $old_height > 100) { $new_width = ceil($scale*$old_width); $new_height = ceil($scale*$old_height); } else { $new_width = $old_width; $new_height = $old_height; } $new = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($new, $image,0, 0, 0, 0,$new_width, $new_height, $old_width, $old_height); switch(strtolower($_FILES[$control][''type''])) { case ''image/jpeg'': imagejpeg($new, $path.''tn_''.$imageName, 90); break; case ''image/png'': imagealphablending($new, false); imagecopyresampled($new, $image,0, 0, 0, 0,$new_width, $new_height, $old_width, $old_height); imagesavealpha($new, true); imagepng($new, $path.''tn_''.$imageName, 0); break; case ''image/gif'': imagegif($new, $path.''tn_''.$imageName); break; default: } } imagedestroy($image); imagedestroy($new); print ''<div style="font-family:arial;"><b>''.$imageName.''</b> Uploaded successfully. Size: ''.round($_FILES[$control][''size'']/1000).''kb</div>''; }

Ver HTML:

echo ''<input type="file" name="manuLogoUpload" id="manuLogoUpload" onchange="return ajaxFileUpload2(this);"/>'';

Ver llamada ajax:

function ajaxFileUpload2(upload_field) { var re_text = //.jpg|/.gif|/.jpeg|/.png/i; var filename = upload_field.value; var imagename = filename.replace("C://fakepath//",""); if (filename.search(re_text) == -1) { alert("File must be an image"); upload_field.form.reset(); return false; } upload_field.form.action = "addManufacturerLogo"; upload_field.form.target = "upload_iframe"; upload_field.form.submit(); upload_field.form.action = ""; upload_field.form.target = ""; document.getElementById("logoFileName").value = imagename; document.getElementById("logoFileName1").value = imagename; document.getElementById("manuLogoText").style.display="block"; document.getElementById("logoLink").style.display="none"; $.prettyPhoto.close(); return true; }

Función regular del controlador:

function addManufacturerLogo() { $control = ''manuLogoUpload''; $image = $_FILES[$control][''name'']; if($imageName = $this->doUpload($control,LOGO_PATH,$image,''all'')) { } else { } }

config / constants.php << para LOGO_PATH. Cambie estos (y el nombre) para adaptarse a sus propósitos. El razonamiento es que si alguna vez cambio dónde quiero guardar las imágenes, las cambio en las constantes en lugar de en 10 lugares a lo largo de mi aplicación.

define(''LOGO_PATH'',APPPATH.''assets/images/manulogos/''); define(''PROD_IMAGE_PATH'',APPPATH.''../assets/images/prod_images/'');


Lo mejor es usar herramientas del lado del cliente para cambiar el tamaño de la imagen localmente, luego subirla. También puede cambiar el tamaño del lado del servidor (usando php gd), pero php copia el archivo en la memoria y, por defecto, solo puede cambiar el tamaño de las imágenes hasta +/- 2MB. Puede restringir el tamaño de carga y el tamaño utilizando php o puede usar Flash, Silverlight o JavaApplets.

Aquí hay otra pregunta sobre el cambio de tamaño del lado del cliente usando flash

ACTUALIZAR:

Ejemplo para cambiar el tamaño del servidor utilizando la lib de manipulación de imágenes de CI

$config[''image_library''] = ''gd2''; $config[''source_image''] = $_FILES[''image''][''tmp_name'']; $config[''new_image''] = $target_path $config[''maintain_ratio''] = TRUE; $config[''width''] = 250; $config[''height''] = 400; $this->load->library(''image_lib'', $config); if (!$this->image_lib->resize()) { echo $this->image_lib->display_errors(); }

Más información sobre el cambio de tamaño lib