2010-08-20 15 views
10

Duplicar posible:
Can anybody suggest the best image resize script in php?tamaño de imagen PHP

sigo siendo un novato en relación con el tratamiento de imágenes o un archivo de manejo para el caso en PHP.

agradecería cualquier información respecto a lo siguiente

puedo enviar un archivo de imagen utilizando un simple formulario HTML y subirlo a través de PHP. Cuando intento y modifico mi código para acomodar archivos más grandes (es decir, cambiar el tamaño) recibo un error. Han estado buscando en línea, pero no puedo encontrar nada realmente simple.

$size = getimagesize($_FILES['image']['tmp_name']); 

//compare the size with the maxim size we defined and print error if bigger 
if ($size == FALSE) 
{ 
    $errors=1; 
}else if($size[0] > 300){ //if width greater than 300px 
    $aspectRatio = 300/$size[0]; 
    $newWidth = round($aspectRatio * $size[0]); 
    $newHeight = round($aspectRatio * $size[1]); 
    $imgHolder = imagecreatetruecolor($newWidth,$newHeight); 
} 

$newname= ROOTPATH.LOCALDIR."/images/".$image_name; //image_name is generated 

$copy = imagecopyresized($imgHolder, $_FILES['image']['tmp_name'], 0, 0, 0, 0, $newWidth, $newHeight, $size[0], $size[1]); 
move_uploaded_file($copy, $newname); //where I want to move the file to the location of $newname 

El error que consigo es:

imagecopyresized(): argumento proporcionado no es un recurso de imagen válido en

Gracias de antemano


Gracias para todas sus entradas, lo he cambiado a este

$oldImage = imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name'])); 
$copy = imagecopyresized($imgHolder, $oldImage, 0, 0, 0, 0, $newWidth, $newHeight, $size[0], $size[1]); 
if(!move_uploaded_file($copy, $newname)){ 
    $errors=1; 
} 

no conseguir un error de registro de PHP, pero no es el ahorro :(

¿Alguna idea?

Gracias de nuevo


Resultado

siguientes obras.

$oldImage = imagecreatefromjpeg($img); 
$imageHolder = imagecreatetruecolor($newWidth, $newHeight); 
imagecopyresized($imageHolder, $oldImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 
imagejpeg($imageHolder, $newname, 100); 

Gracias por everyones ayudan

+0

Los permisos a menudo pueden ser la fuente de problemas "no obteniendo un error pero no guardando". – DLH

+0

nah el archivo carga ... mi viejo script simplemente subió y funcionó bien. Solo ajustándolo con el tamaño también ... estoy pinchando en la oscuridad un poco tbh. – Stevanicus

+0

Solo quiero decir gracias por publicar el código que terminaste usando. Acabo de copiar eso, agregué algunas cosas (proporción, leyendo información de la imagen anterior) y funciona asombrosamente para mis necesidades. ¡Gracias! – Tarka

Respuesta

5

imagecopyresized toma un recurso de imagen como segundo parámetro, no un nombre de archivo. Primero deberá cargar el archivo. Si conoce el tipo de archivo, puede usar imagecreatefromFILETYPE para cargarlo. Por ejemplo, si se trata de un JPEG, use imagecreatefromjpeg y páselo por el nombre del archivo; esto devolverá un recurso de imagen.

Si no conoce el tipo de archivo, no todo está perdido. Usted puede leer el archivo en forma de cadena y utilizar imagecreatefromstring (que detecta los tipos de archivos de forma automática) para cargar la siguiente manera:

$oldImage = imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name'])); 
+0

Gracias, he editado mi pregunta con su implementación ... todavía tengo algunos problemas. – Stevanicus

3

$_FILES['image']['tmp_name'] no es ruta del recurso de imagen. Debe usar una de las funciones imagecreatefrom *() para crear un recurso.

2

utilizo para ImageMagick cosas por el estilo. ¡Mira cuánto más simple es!

Un ejemplo de uno de mis guiones:

$target= //destination path 
move_uploaded_file($_FILES['item']['tmp_name'],$target); 

$image = new imagick($target); 

$image->setImageColorspace(imagick::COLORSPACE_RGB); 
$image->scaleImage(350,0); 

$image->writeImage($target); 

A continuación, podría utilizar getImageGeometry() para obtener la anchura y altura.

Por ejemplo:

$size=$image->getImageGeometry(); 
if($size['width'] > 300){ //if width greater than 
    $image->scaleImage(300,0); 
} 

Además, el uso scaleImage(300,0) significa que ImageMagick calcula automáticamente la altura en base a la relación de aspecto.

3

Aquí es mi implementación de guardar una imagen en miniatura:

cambiar el tamaño y la función de ahorro:

function SaveThumbnail($imagePath, $saveAs, $max_x, $max_y) 
{ 
    ini_set("memory_limit","32M"); 
    $im = imagecreatefromjpeg ($imagePath); 
    $x = imagesx($im); 
    $y = imagesy($im); 

    if (($max_x/$max_y) < ($x/$y)) 
    { 
     $save = imagecreatetruecolor($x/($x/$max_x), $y/($x/$max_x)); 
    } 
    else 
    { 
     $save = imagecreatetruecolor($x/($y/$max_y), $y/($y/$max_y)); 
    } 
    imagecopyresized($save, $im, 0, 0, 0, 0, imagesx($save), imagesy($save), $x, $y); 

    imagejpeg($save, $saveAs); 
    imagedestroy($im); 
    imagedestroy($save); 
} 

Uso:

$thumb_dir = "/path/to/thumbnaildir/" 
$thumb_name = "thumb.jpg" 
$muf = move_uploaded_file($_FILES['imgfile']['tmp_name'], "/tmp/test.jpg") 

if($muf) 
{ 
    SaveThumbnail("/tmp/test.jpg", $thumb_dir . $thumb_name, 128, 128); 
} 
0

yo estaba trabajando en algo parecido. Intenté Ghostscript e ImageMagic. Son buenas herramientas, pero lleva un tiempo de configuración. Terminé usando 'sorbos' en un servidor de Snow Leopard. No estoy seguro si está integrado en el servidor Linux, pero es la solución más rápida que he encontrado si necesita algo rápido.

0
function resizeImage($file){ 

     define ('MAX_WIDTH', 1500);//max image width    
     define ('MAX_HEIGHT', 1500);//max image height 
     define ('MAX_FILE_SIZE', 10485760); 

     //iamge save path 
     $path = 'storeResize/'; 

     //size of the resize image 
     $new_width = 128; 
     $new_height = 128;  

     //name of the new image   
     $nameOfFile = 'resize_'.$new_width.'x'.$new_height.'_'.basename($file['name']);  

     $image_type = $file['type']; 
     $image_size = $file['size']; 
     $image_error = $file['error']; 
     $image_file = $file['tmp_name']; 
     $image_name = $file['name'];   

     $image_info = getimagesize($image_file); 

     //check image type 
     if ($image_info['mime'] == 'image/jpeg' or $image_info['mime'] == 'image/jpg'){  
     } 
     else if ($image_info['mime'] == 'image/png'){  
     } 
     else if ($image_info['mime'] == 'image/gif'){  
     } 
     else{    
      //set error invalid file type 
     } 

     if ($image_error){ 
      //set error image upload error 
     } 

     if ($image_size > MAX_FILE_SIZE){ 
      //set error image size invalid 
     } 

     switch ($image_info['mime']) { 
      case 'image/jpg': //This isn't a valid mime type so we should probably remove it 
      case 'image/jpeg': 
      $image = imagecreatefromjpeg ($image_file); 
      break; 
      case 'image/png': 
      $image = imagecreatefrompng ($image_file); 
      break; 
      case 'image/gif': 
      $image = imagecreatefromgif ($image_file); 
      break; 
     }  

     if ($new_width == 0 && $new_height == 0) { 
      $new_width = 100; 
      $new_height = 100; 
     } 

     // ensure size limits can not be abused 
     $new_width = min ($new_width, MAX_WIDTH); 
     $new_height = min ($new_height, MAX_HEIGHT); 

     //get original image h/w 
     $width = imagesx ($image); 
     $height = imagesy ($image); 

     //$align = 'b'; 
     $zoom_crop = 1; 
     $origin_x = 0; 
     $origin_y = 0; 
     //TODO setting Memory 

     // generate new w/h if not provided 
     if ($new_width && !$new_height) { 
      $new_height = floor ($height * ($new_width/$width)); 
     } else if ($new_height && !$new_width) { 
      $new_width = floor ($width * ($new_height/$height)); 
     } 

     // scale down and add borders 
    if ($zoom_crop == 3) { 

     $final_height = $height * ($new_width/$width); 

     if ($final_height > $new_height) { 
      $new_width = $width * ($new_height/$height); 
     } else { 
      $new_height = $final_height; 
     } 

    } 

     // create a new true color image 
     $canvas = imagecreatetruecolor ($new_width, $new_height); 
     imagealphablending ($canvas, false); 


     if (strlen ($canvas_color) < 6) { 
      $canvas_color = 'ffffff';  
     } 

     $canvas_color_R = hexdec (substr ($canvas_color, 0, 2)); 
     $canvas_color_G = hexdec (substr ($canvas_color, 2, 2)); 
     $canvas_color_B = hexdec (substr ($canvas_color, 2, 2)); 

     // Create a new transparent color for image 
     $color = imagecolorallocatealpha ($canvas, $canvas_color_R, $canvas_color_G, $canvas_color_B, 127); 

     // Completely fill the background of the new image with allocated color. 
     imagefill ($canvas, 0, 0, $color); 

     // scale down and add borders 
    if ($zoom_crop == 2) { 

      $final_height = $height * ($new_width/$width); 

     if ($final_height > $new_height) { 
      $origin_x = $new_width/2; 
      $new_width = $width * ($new_height/$height); 
      $origin_x = round ($origin_x - ($new_width/2)); 
      } else { 

      $origin_y = $new_height/2; 
      $new_height = $final_height; 
      $origin_y = round ($origin_y - ($new_height/2)); 

     } 

    } 

     // Restore transparency blending 
     imagesavealpha ($canvas, true); 

     if ($zoom_crop > 0) { 

      $src_x = $src_y = 0; 
      $src_w = $width; 
      $src_h = $height; 

      $cmp_x = $width/$new_width; 
      $cmp_y = $height/$new_height; 

      // calculate x or y coordinate and width or height of source 
      if ($cmp_x > $cmp_y) { 
     $src_w = round ($width/$cmp_x * $cmp_y); 
     $src_x = round (($width - ($width/$cmp_x * $cmp_y))/2); 
      } else if ($cmp_y > $cmp_x) { 
     $src_h = round ($height/$cmp_y * $cmp_x); 
     $src_y = round (($height - ($height/$cmp_y * $cmp_x))/2); 
      } 

      // positional cropping! 
     if ($align) { 
      if (strpos ($align, 't') !== false) { 
       $src_y = 0; 
      } 
         if (strpos ($align, 'b') !== false) { 
           $src_y = $height - $src_h; 
         } 
         if (strpos ($align, 'l') !== false) { 
       $src_x = 0; 
      } 
      if (strpos ($align, 'r') !== false) { 
       $src_x = $width - $src_w; 
      } 
     } 

      // positional cropping! 
      imagecopyresampled ($canvas, $image, $origin_x, $origin_y, $src_x, $src_y, $new_width, $new_height, $src_w, $src_h); 

     } else {  
     imagecopyresampled ($canvas, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 
    } 
     //Straight from Wordpress core code. Reduces filesize by up to 70% for PNG's 
     if ((IMAGETYPE_PNG == $image_info[2] || IMAGETYPE_GIF == $image_info[2]) && function_exists('imageistruecolor') && !imageistruecolor($image) && imagecolortransparent($image) > 0){ 
      imagetruecolortopalette($canvas, false, imagecolorstotal($image)); 
    } 
     $quality = 100;    
     $nameOfFile = 'resize_'.$new_width.'x'.$new_height.'_'.basename($file['name']);  

    if (preg_match('/^image\/(?:jpg|jpeg)$/i', $image_info['mime'])){      
     imagejpeg($canvas, $path.$nameOfFile, $quality); 

    } else if (preg_match('/^image\/png$/i', $image_info['mime'])){       
     imagepng($canvas, $path.$nameOfFile, floor($quality * 0.09)); 

    } else if (preg_match('/^image\/gif$/i', $image_info['mime'])){    
     imagegif($canvas, $path.$nameOfFile); 

    } 
}