Resize images with PHP, support PNG, JPG

前端 未结 7 1383
囚心锁ツ
囚心锁ツ 2020-12-08 01:37

I am using this class:

class ImgResizer {

function ImgResizer($originalFile = \'$newName\') {
    $this -> originalFile = $originalFile;
}
function resiz         


        
相关标签:
7条回答
  • 2020-12-08 01:53

    Try this one and using this you can also save your image to specific path.

    function resize($file, $imgpath, $width, $height){
        /* Get original image x y*/
        list($w, $h) = getimagesize($file['tmp_name']);
        /* calculate new image size with ratio */
        $ratio = max($width/$w, $height/$h);
        $h = ceil($height / $ratio);
        $x = ($w - $width / $ratio) / 2;
        $w = ceil($width / $ratio);
    
        /* new file name */
        $path = $imgpath;
        /* read binary data from image file */
        $imgString = file_get_contents($file['tmp_name']);
        /* create image from string */
        $image = imagecreatefromstring($imgString);
        $tmp = imagecreatetruecolor($width, $height);
        imagecopyresampled($tmp, $image, 0, 0, $x, 0, $width, $height, $w, $h);
        /* Save image */
        switch ($file['type']) {
           case 'image/jpeg':
              imagejpeg($tmp, $path, 100);
              break;
           case 'image/png':
              imagepng($tmp, $path, 0);
              break;
           case 'image/gif':
              imagegif($tmp, $path);
              break;
              default:
              //exit;
              break;
            }
         return $path;
    
         /* cleanup memory */
         imagedestroy($image);
         imagedestroy($tmp);
    }
    

    Now you need to call this function while saving image as like...

    <?php
    
        //$imgpath = "Where you want to save your image";
        resize($_FILES["image"], $imgpath, 340, 340);
    
    ?>
    
    0 讨论(0)
  • 2020-12-08 01:58

    I took the P. Galbraith's version, fixed the errors and changed it to resize by area (width x height). For myself, I wanted to resize images that are too big.

    function resizeByArea($originalFile,$targetFile){
    
        $newArea = 375000; //a little more than 720 x 480
    
        list($width,$height,$type) = getimagesize($originalFile);
        $area = $width * $height;
    
    if($area > $newArea){
    
        if($width > $height){ $big = $width; $small = $height; }
        if($width < $height){ $big = $height; $small = $width; }
    
        $ratio = $big / $small;
    
        $newSmall = sqrt(($newArea*$small)/$big);
        $newBig = $ratio*$newSmall;
    
        if($width > $height){ $newWidth = round($newBig, 0); $newHeight = round($newSmall, 0); }
        if($width < $height){ $newWidth = round($newSmall, 0); $newHeight = round($newBig, 0); }
    
        }
    
    switch ($type) {
        case '2':
                $image_create_func = 'imagecreatefromjpeg';
                $image_save_func = 'imagejpeg';
                $new_image_ext = '.jpg';
                break;
    
        case '3':
                $image_create_func = 'imagecreatefrompng';
             // $image_save_func = 'imagepng';
             // The quality is too high with "imagepng"
             // but you need it if you want to allow transparency
                $image_save_func = 'imagejpeg';
                $new_image_ext = '.png';
                break;
    
        case '1':
                $image_create_func = 'imagecreatefromgif';
                $image_save_func = 'imagegif';
                $new_image_ext = '.gif';
                break;
    
        default: 
                throw Exception('Unknown image type.');
    }
    
        $img = $image_create_func($originalFile);
        $tmp = imagecreatetruecolor($newWidth,$newHeight);
        imagecopyresampled( $tmp, $img, 0, 0, 0, 0,$newWidth,$newHeight, $width, $height );
    
        ob_start();
        $image_save_func($tmp);
        $i = ob_get_clean();
    
        // if file exists, create a new one with "1" at the end
        if (file_exists($targetFile.$new_image_ext)){
          $targetFile = $targetFile."1".$new_image_ext;
        }
        else{
          $targetFile = $targetFile.$new_image_ext;
        }
    
        $fp = fopen ($targetFile,'w');
        fwrite ($fp, $i);
        fclose ($fp);
    
        unlink($originalFile);
    }
    

    If you want to allow transparency, check this : http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/

    I tested the function, it works fine!

    0 讨论(0)
  • 2020-12-08 02:03

    You can try this. Currently it's assuming the image will always be a jpeg. This will allow you to load a jpeg, png, or gif. I haven't tested but it should work.

    function resize($newWidth, $targetFile) {
        if (empty($newWidth) || empty($targetFile)) {
            return false;
        }
    
        $fileHandle = @fopen($this->originalFile, 'r');
    
        //error loading file
        if(!$fileHandle) {
            return false;
        }
    
        $src = imagecreatefromstring(stream_get_contents($fileHandle));
    
        fclose($fileHandle);
    
        //error with loading file as image resource
        if(!$src) {
            return false;
        }
    
        //get image size from $src handle
        list($width, $height) = array(imagesx($src), imagesy($src));
    
        $newHeight = ($height / $width) * $newWidth;
    
        $tmp = imagecreatetruecolor($newWidth, $newHeight);
    
        imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
    
        //allow transparency for pngs
        imagealphablending($tmp, false);
        imagesavealpha($tmp, true);
    
        if (file_exists($targetFile)) {
            unlink($targetFile);
        }
    
        //handle different image types.
        //imagepng() uses quality 0-9
        switch(strtolower(pathinfo($this->originalFile, PATHINFO_EXTENSION))) {
            case 'jpg':
            case 'jpeg':
                imagejpeg($tmp, $targetFile, 95);
                break;
            case 'png':
                imagepng($tmp, $targetFile, 8.5);
                break;
            case 'gif':
                imagegif($tmp, $targetFile);
                break;
        }
    
        //destroy image resources
        imagedestroy($tmp);
        imagedestroy($src);
    }
    
    0 讨论(0)
  • 2020-12-08 02:12

    I know this is very old thread, but I found PHP has imagescale function built in, which does the required job. See documentation here

    Example usage:

    $temp = imagecreatefrompng('1.png'); 
    $scaled_image= imagescale ( $temp, 200 , 270);
    

    Here 200 is width and 270 is height of resized image.

    0 讨论(0)
  • 2020-12-08 02:13
    function resize($newWidth, $targetFile, $originalFile) {
    
        $info = getimagesize($originalFile);
        $mime = $info['mime'];
    
        switch ($mime) {
                case 'image/jpeg':
                        $image_create_func = 'imagecreatefromjpeg';
                        $image_save_func = 'imagejpeg';
                        $new_image_ext = 'jpg';
                        break;
    
                case 'image/png':
                        $image_create_func = 'imagecreatefrompng';
                        $image_save_func = 'imagepng';
                        $new_image_ext = 'png';
                        break;
    
                case 'image/gif':
                        $image_create_func = 'imagecreatefromgif';
                        $image_save_func = 'imagegif';
                        $new_image_ext = 'gif';
                        break;
    
                default: 
                        throw new Exception('Unknown image type.');
        }
    
        $img = $image_create_func($originalFile);
        list($width, $height) = getimagesize($originalFile);
    
        $newHeight = ($height / $width) * $newWidth;
        $tmp = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($tmp, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
    
        if (file_exists($targetFile)) {
                unlink($targetFile);
        }
        $image_save_func($tmp, "$targetFile.$new_image_ext");
    }
    
    0 讨论(0)
  • 2020-12-08 02:15

    the accepted answer has alot of errors here is it fixed

    <?php 
    
    
    
    
    function resize($newWidth, $targetFile, $originalFile) {
    
        $info = getimagesize($originalFile);
        $mime = $info['mime'];
    
        switch ($mime) {
                case 'image/jpeg':
                        $image_create_func = 'imagecreatefromjpeg';
                        $image_save_func = 'imagejpeg';
                        $new_image_ext = 'jpg';
                        break;
    
                case 'image/png':
                        $image_create_func = 'imagecreatefrompng';
                        $image_save_func = 'imagepng';
                        $new_image_ext = 'png';
                        break;
    
                case 'image/gif':
                        $image_create_func = 'imagecreatefromgif';
                        $image_save_func = 'imagegif';
                        $new_image_ext = 'gif';
                        break;
    
                default: 
                        throw Exception('Unknown image type.');
        }
    
        $img = $image_create_func($originalFile);
        list($width, $height) = getimagesize($originalFile);
        $newHeight = ($height / $width) * $newWidth;
        $tmp = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($tmp, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
    
        if (file_exists($targetFile)) {
                unlink($targetFile);
        }
        $image_save_func($tmp, "$targetFile.$new_image_ext");
    }
    
    
    
    $img=$_REQUEST['img'];
    $id=$_REQUEST['id'];
    
      //  echo $img
    resize(120, $_SERVER['DOCUMENT_ROOT'] ."/images/$id",$_SERVER['DOCUMENT_ROOT'] ."/images/$img") ;
    
    
    ?>
    
    0 讨论(0)
提交回复
热议问题