-1

哪种方式更好调整图像大小?

现在我正在使用缩略图类,它工作正常,但它降低了图像质量太多。

我想要大小为 32 x 32的拇指形式的个人资料图像。

我现在使用的代码是:

$cimg = $_FILES["image_src"]["name"];

move_uploaded_file($_FILES["image_src"]["tmp_name"],"uploads/profile_images/".$cimg);

$thumb=new thumbnail("uploads/profile_images/".$cimg); 

$thumb->size_width(32); 

$thumb->save("uploads/profile_images/".$cimg);

$thumb=new thumbnail("uploads/profile_images/".$cimg); 

$thumb->size_width(32); 


$thumb->save("uploads/profile_images/thumbs/".$cimg);

请建议我一些更好的方法来做到这一点。我的图像现在过于拉伸且质量低下。

我的缩略图类:

class thumbnail

{

    var $img;



    function thumbnail($imgfile)

    {

        //detect image format

        $this->img["format"]=ereg_replace(".*\.(.*)$","\\1",$imgfile);

        $this->img["format"]=strtoupper($this->img["format"]);

        if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG") {

            //JPEG

            $this->img["format"]="JPEG";

            $this->img["src"] = ImageCreateFromJPEG ($imgfile);

        } elseif ($this->img["format"]=="PNG") {

            //PNG

            $this->img["format"]="PNG";

            $this->img["src"] = ImageCreateFromPNG ($imgfile);

        } elseif ($this->img["format"]=="GIF") {

            //GIF

            $this->img["format"]="GIF";

            $this->img["src"] = ImageCreateFromGIF ($imgfile);

        } elseif ($this->img["format"]=="WBMP") {

            //WBMP

            $this->img["format"]="WBMP";

            $this->img["src"] = ImageCreateFromWBMP ($imgfile);

        } else {

            //DEFAULT

            echo "Not Supported File";

            exit();

        }

        @$this->img["lebar"] = imagesx($this->img["src"]);

        @$this->img["tinggi"] = imagesy($this->img["src"]);

        //default quality jpeg

        $this->img["quality"]=75;

    }



    function size_height($size=100)

    {

        //height

        $this->img["tinggi_thumb"]=$size;

        @$this->img["lebar_thumb"] = ($this->img["tinggi_thumb"]/$this->img["tinggi"])*$this->img["lebar"];

    }



    function size_width($size=100)

    {

        //width

        $this->img["lebar_thumb"]=$size;

        @$this->img["tinggi_thumb"] = ($this->img["lebar_thumb"]/$this->img["lebar"])*$this->img["tinggi"];

    }



    function size_auto($size=100)

    {

        //size

        if ($this->img["lebar"]>=$this->img["tinggi"]) {

            $this->img["lebar_thumb"]=$size;

            @$this->img["tinggi_thumb"] = ($this->img["lebar_thumb"]/$this->img["lebar"])*$this->img["tinggi"];

        } else {

            $this->img["tinggi_thumb"]=$size;

            @$this->img["lebar_thumb"] = ($this->img["tinggi_thumb"]/$this->img["tinggi"])*$this->img["lebar"];

        }

    }



    function jpeg_quality($quality=75)

    {

        //jpeg quality

        $this->img["quality"]=$quality;

    }



    function show()

    {

        //show thumb

        @Header("Content-Type: image/".$this->img["format"]);



        /* change ImageCreateTrueColor to ImageCreate if your GD not supported ImageCreateTrueColor function*/

        $this->img["des"] = ImageCreateTrueColor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);

            @imagecopyresized ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);



        if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG") {

            //JPEG

            imageJPEG($this->img["des"],"",$this->img["quality"]);

        } elseif ($this->img["format"]=="PNG") {

            //PNG

            imagePNG($this->img["des"]);

        } elseif ($this->img["format"]=="GIF") {

            //GIF

            imageGIF($this->img["des"]);

        } elseif ($this->img["format"]=="WBMP") {

            //WBMP

            imageWBMP($this->img["des"]);

        }

    }



    function save($save="")

    {

        //save thumb

        if (empty($save)) $save=strtolower("./thumb.".$this->img["format"]);

        /* change ImageCreateTrueColor to ImageCreate if your GD not supported ImageCreateTrueColor function*/

        $this->img["des"] = ImageCreateTrueColor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);

            @imagecopyresized ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);



        if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG") {

            //JPEG

            imageJPEG($this->img["des"],"$save",$this->img["quality"]);

        } elseif ($this->img["format"]=="PNG") {

            //PNG

            imagePNG($this->img["des"],"$save");

        } elseif ($this->img["format"]=="GIF") {

            //GIF

            imageGIF($this->img["des"],"$save");

        } elseif ($this->img["format"]=="WBMP") {

            //WBMP

            imageWBMP($this->img["des"],"$save");

        }

    }

}

?>
4

1 回答 1

0

这对我有用imagecopyresampled(请注意,图像将始终使用 .png 格式保存并保持纵横比):

// thumbnail size
$thumb_width = 32;  $thumb_height = 32;

// get image from post from
$img  = $_FILES['image_src']['tmp_name'];           

// thumbnail filename
$dst = 'uploads/profile_images/thumbs/image_name.png';

// check valid image
if (($img_info = getimagesize($img)) === FALSE) { die("Image not found or not an image"); }

// check source image format and check valid image. get image in $src variable if valid image
switch ($img_info[2]) {
    case IMAGETYPE_GIF  : $src = imagecreatefromgif($img);  break;
    case IMAGETYPE_JPEG : $src = imagecreatefromjpeg($img); break;
    case IMAGETYPE_PNG  : $src = imagecreatefrompng($img);  break;
    default : $src = false;
}
if(!$src) { die("Image not found or not an image"); }

// get metrics to resize image to fit to thumbnail size
$width = $img_info[0];  $height = $img_info[1];
$original_aspect = $width / $height;
$thumb_aspect = $thumb_width / $thumb_height;

if ( $original_aspect >= $thumb_aspect ) {
   $new_height = $thumb_height;
   $new_width = $width / ($height / $thumb_height);
}
else {
   $new_width = $thumb_width;
   $new_height = $height / ($width / $thumb_width);
}

// create thumbnail
$tmp = imagecreatetruecolor($thumb_width, $thumb_height);
imagecopyresampled($tmp, $src, 0 - ($new_width - $thumb_width) / 2, 0 - ($new_height - $thumb_height) / 2, 0, 0, $new_width, $new_height, $width, $height);
imagepng($tmp, $dst);
于 2013-09-22T14:14:23.727 回答