Maison  >  Article  >  développement back-end  >  Explication détaillée de la fonction de redimensionnement d'image en PHP pour ajuster la taille de l'image

Explication détaillée de la fonction de redimensionnement d'image en PHP pour ajuster la taille de l'image

黄舟
黄舟original
2017-07-26 13:47:217556parcourir

J'ai utilisé certaines fonctions de redimensionnement d'image implémentées en PHP, mais elles ne sont pas parfaites. Certaines images sont complètement déformées après ajustement, et certaines ont plus de lignes sans raison, et certaines ont une faible luminosité des couleurs. Pas satisfaisant non plus. Aujourd'hui, j'ai cherché à nouveau et j'ai obtenu d'autres résultats.

if(isset($_FILES['manager_photo']) && !empty($_FILES['manager_photo']['name']))
    {
        $photo_name=$manager_name."-".$_FILES["manager_photo"]["name"];
        $tmpname = $_FILES['manager_photo']['tmp_name'];
        $file_ext= substr($photo_name, strripos($photo_name, '.'));   
        $dir = "./manager_photos/";
        // finally resize
        @img_resize( $tmpname , 90 ,  $dir , $photo_name, 1);
}
function img_resize( $tmpname, $size, $save_dir, $save_name, $maxisheight = 0 )
    {
    $save_dir     .= ( substr($save_dir,-1) != "/") ? "/" : "";
    $gis        = getimagesize($tmpname);
    $type        = $gis[2];
    switch($type)
        {
        case "1": $imorig = imagecreatefromgif($tmpname); break;
        case "2": $imorig = imagecreatefromjpeg($tmpname);break;
        case "3": $imorig = imagecreatefrompng($tmpname); break;
        default:  $imorig = imagecreatefromjpeg($tmpname);
        }
        $x = imagesx($imorig);
        $y = imagesy($imorig);
        $woh = (!$maxisheight)? $gis[0] : $gis[1] ; 
        if($woh <= $size)
        {
        $aw = $x;
        $ah = $y;
        }
            else
        {
            if(!$maxisheight){
                $aw = $size;
                $ah = $size * $y / $x;
            } else {
                $aw = $size * $x / $y;
                $ah = $size;
            }
        }
        $im = imagecreatetruecolor($aw,$ah);
    if (imagecopyresampled($im,$imorig , 0,0,0,0,$aw,$ah,$x,$y))
        if (imagejpeg($im, $save_dir.$save_name))
            return true;
            else
            return false;
}//img_resize

Utilisez ImageMagick pour l'implémenter

Quelqu'un a mentionné l'utilisation d'ImageMagick pour l'implémenter. Il comporte de nombreuses options et nous pouvons réaliser un ajustement d'image avec très peu de code. Cela vaut la peine d'être étudié.

 $image = new Imagick($src);
 $image->resizeImage($width,$height,Imagick::FILTER_LANCZOS,1);
 $image->cropImage($width_2, $height_2, $x, $y);
 $image->setCompression(Imagick::COMPRESSION_JPEG);
 $image->setImageCompressionQuality(82);
 $image->writeImage($dest);
 $image->destroy();

Utilisez php_class_upload pour implémenter

Si l'introduction ci-dessus ne vous convient pas, vous pouvez non seulement télécharger et ajuster des images, mais également couper, couper, ajouter des filigranes, faire pivoter, retourner , etc.

Autre référence du code d'implémentation

Ce code peut renvoyer l'image et le nom correct, mais il ne peut être que noir ?

function resize($originalImage){
list($width, $height) = getimagesize($originalImage);
$newName=basename($originalImage);
$imageResized = imagecreatetruecolor(128, 128);
$imageTmp = imagecreatefromjpeg($originalImage);
imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, 128, 128, $width, $height);
imagejpeg($imageResized, "resizedImg/$newName",100);
imageDestroy($imageResized);
}

Une fois le code amélioré, regardez le code suivant pour définir la couleur.

function resizeImage($file){
        define (&#39;MAX_WIDTH&#39;, 1500);//max image width              
        define (&#39;MAX_HEIGHT&#39;, 1500);//max image height
        define (&#39;MAX_FILE_SIZE&#39;, 10485760);
        //iamge save path
        $path = &#39;storeResize/&#39;; 
        //size of the resize image
        $new_width = 128;
        $new_height = 128;   
        //name of the new image          
        $nameOfFile = &#39;resize_&#39;.$new_width.&#39;x&#39;.$new_height.&#39;_&#39;.basename($file[&#39;name&#39;]);     
        $image_type = $file[&#39;type&#39;];
        $image_size = $file[&#39;size&#39;];
        $image_error = $file[&#39;error&#39;];
        $image_file = $file[&#39;tmp_name&#39;];
        $image_name = $file[&#39;name&#39;];       
        $image_info = getimagesize($image_file);
        //check image type
        if ($image_info[&#39;mime&#39;] == &#39;image/jpeg&#39; or $image_info[&#39;mime&#39;] == &#39;image/jpg&#39;){   
        }
        else if ($image_info[&#39;mime&#39;] == &#39;image/png&#39;){   
        }
        else if ($image_info[&#39;mime&#39;] == &#39;image/gif&#39;){   
        }
        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[&#39;mime&#39;]) {
            case &#39;image/jpg&#39;: //This isn&#39;t a valid mime type so we should probably remove it
            case &#39;image/jpeg&#39;:
            $image = imagecreatefromjpeg ($image_file);
            break;
            case &#39;image/png&#39;:
            $image = imagecreatefrompng ($image_file);
            break;
            case &#39;image/gif&#39;:
            $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 = &#39;b&#39;;
        $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 = &#39;ffffff&#39;;      
        }
        $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, &#39;t&#39;) !== false) {
                $src_y = 0;
            }
                        if (strpos ($align, &#39;b&#39;) !== false) {
                                $src_y = $height - $src_h;
                        }
                        if (strpos ($align, &#39;l&#39;) !== false) {
                $src_x = 0;
            }
            if (strpos ($align, &#39;r&#39;) !== 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&#39;s
        if ( (IMAGETYPE_PNG == $image_info[2] || IMAGETYPE_GIF == $image_info[2]) && function_exists(&#39;imageistruecolor&#39;) && !imageistruecolor( $image ) && imagecolortransparent( $image ) > 0 ){
            imagetruecolortopalette( $canvas, false, imagecolorstotal( $image ) );
    }
        $quality = 100;           
        $nameOfFile = &#39;resize_&#39;.$new_width.&#39;x&#39;.$new_height.&#39;_&#39;.basename($file[&#39;name&#39;]);      
    if (preg_match(&#39;/^image\/(?:jpg|jpeg)$/i&#39;, $image_info[&#39;mime&#39;])){                      
        imagejpeg($canvas, $path.$nameOfFile, $quality); 
    } else if (preg_match(&#39;/^image\/png$/i&#39;, $image_info[&#39;mime&#39;])){                        
        imagepng($canvas, $path.$nameOfFile, floor($quality * 0.09));
    } else if (preg_match(&#39;/^image\/gif$/i&#39;, $image_info[&#39;mime&#39;])){              
        imagegif($canvas, $path.$nameOfFile);
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn