Redimensionar a imagem PHP

Possível Duplicado:
Alguém pode sugerir o melhor script de redimensionamento de imagem no php?

Eu ainda sou um novato no que diz respeito ao tratamento de imagens ou ao tratamento de arquivos para esse assunto em PHP.

Agradeceria qualquer contribuição sobre o seguinte

Posso publicar um arquivo de imagem usando um formulário html simples e enviá-lo via php. Quando eu tento alterar meu código para acomodar arquivos maiores (ou seja, resize) recebo um erro. Tem pesquisado on-line, mas não consigo encontrar nada de simples.

$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 

O erro que recebo é:

imagecopyresized (): argumento fornecido não é um recurso de imagem válido em

desde já, obrigado


Obrigado por toda a sua contribuição, eu mudei para isso

 $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; } 

Não obteve um erro de log do PHP, mas não está salvando 🙁

Alguma ideia?

obrigado novamente


Resultado

Trabalhos seguintes.

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

Obrigado pela ajuda de todos

imagecopyresized leva um recurso de imagem como seu segundo parâmetro, não um nome de arquivo. Você precisará carregar o arquivo primeiro. Se você conhece o tipo de arquivo, você pode usar imagecreatefromFILETYPE para carregá-lo. Por exemplo, se é um JPEG, use imagecreatefromjpeg e passe que o nome do arquivo – isso irá retornar um recurso de imagem.

Se você não conhece o tipo de arquivo, tudo não está perdido. Você pode ler o arquivo como uma string e usar imagecreatefromstring (que detecta os tipos de arquivo automaticamente) para carregá-lo da seguinte maneira:

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

$_FILES['image']['tmp_name'] é caminho não recurso de imagem. Você precisa usar uma das funções imagecreatefrom * () para criar resources.

Aqui está a minha implementação de salvar uma imagem em miniatura:

Função de resize e salvar:

 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); } 

Eu uso ImageMagick para coisas assim. Olhe quanto mais simples é!

Um exemplo de um dos meus scripts:

 $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); 

Você pode usar getImageGeometry () para obter a largura e a altura.

Por exemplo:

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

Além disso, usando scaleImage(300,0) significa que o ImageMagick calcula automaticamente a altura com base na relação de aspecto.

Eu estava trabalhando em algo semelhante. Eu tentei Ghostscript e ImageMagic. Eles são boas ferramentas, mas tem um tempo de criação. Acabei usando ‘sips’ em um servidor Snow Leopard. Não tenho certeza se foi incorporado ao servidor Linux, mas é a solução mais rápida que encontrei se precisar de algo rápido.

 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); } }