Php调整图像大小增加图像大小

时间:2013-11-30 12:35:14

标签: php php-gd gd2

我正在创建上传文件的thumnails。

如果图像宽度和高度大于200,则将其调整为200px。

以下是我用来做的代码:

if (file_exists($old_file)) {
        $path_parts = pathinfo($old_file);
        $extension = $path_parts['extension'];
        $filename_path = $filepath . $filename;
        $destination_path = $filename_path;
        if (strtolower($extension) == "jpg" || strtolower($extension) == "jpeg") {
            $uploadedfile = $old_file;
            $src = imagecreatefromjpeg($uploadedfile);
        } else if (strtolower($extension) == "png") {
            $uploadedfile = $old_file;
            $src = imagecreatefrompng($uploadedfile);
        } else {
            $uploadedfile = $old_file;
            $src = imagecreatefromgif($uploadedfile);
        }
        list($width, $height) = getimagesize($uploadedfile);
        $newwidth = $Size['width'];
        $newheight = $Size['height'];
        if ($width <= $newwidth && $height <= $newheight) {
            $newwidth = $width;
            $newheight = $height;
            $tmp = imagecreatetruecolor($width, $height);
        } else {
            if ($width > $height) {
                $newheight = ($height / $width) * $newwidth;
                $tmp = imagecreatetruecolor($newwidth, $newheight);
            } else {
                $newwidth = ($width / $height) * $newheight;
                $tmp = imagecreatetruecolor($newwidth, $newheight);
            }
        }
        if ((strtolower($extension) == "png") OR (strtolower($extension) == "gif")) {
            imagealphablending($tmp, false);
            imagesavealpha($tmp, true);
            $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
            imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
        }
        imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
        if (strtolower($extension) == "jpg" || strtolower($extension) == "jpeg") {
            imagejpeg($tmp, $destination_path, 100);
        } elseif (strtolower($extension) == "png") {
            imagepng($tmp, $destination_path, 5);
        } else {
            imagegif($tmp, $destination_path);
        }
        chmod($destination_path, 0777);
        imagedestroy($src);
        imagedestroy($tmp);
        ob_flush();
        flush();
        ob_end_flush();
        return true;
    } else {
        return false;
    }

它将大图像的尺寸调整为200px×200px,但图像尺寸增加(字节和kb等增加)。

我尝试上传8kb png文件,新的缩略图文件大小为28kb?

尝试使用Google搜索,但没有找到任何有用的信息

感谢。

1 个答案:

答案 0 :(得分:3)

您的源图像被压缩,解析后会得到一个真正的彩色图像,它是未压缩的。然后以压缩级别5(在PNG的情况下)保存它,压缩率非常低,因此文件大小更高。

尝试更高的压缩,例如9。另外,请尝试添加过滤器组合以减少文件大小(http://us3.php.net/manual/en/image.constants.php查找PNG_FILTER_*)。

请参阅:http://us3.php.net/manual/en/function.imagepng.php

http://en.wikipedia.org/wiki/Portable_Network_Graphics#Compression http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_size_factors

GD库似乎没有提供任何接口来让您使用低级别的PNG数据,但理论上您可以通过使用其他绑定或尝试手动读取来查找源压缩级别和过滤器。 / p>

http://www.libpng.org/pub/png/spec/1.2/PNG-Compression.html http://www.libpng.org/pub/png/spec/1.2/PNG-Filters.html

JPG和GIF可能会发生同样的情况。