1

アップロードしたファイルのサムネイルを作成しています。

画像の幅と高さが 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 x 200px に変更しますが、画像サイズは大きくなります (バイトや kb などが増加します)。

8kb の png ファイルをアップロードしようとしたところ、新しいサムネイル ファイルのサイズが 28kb でしたか?

グーグルを試しましたが、役立つものは何も見つかりませんでした

ありがとう。

4

1 に答える 1

4

ソース画像は圧縮されています。解析後、圧縮されていないトゥルーカラー画像が得られます。次に、圧縮レベル 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 データにアクセスできるインターフェイスを提供していないようですが、理論的には、他のバインディングを使用するか、手動で読み取ろうとすることで、ソースの圧縮レベルとフィルターを見つけることができます。

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 でも同じことが起こります。

于 2013-12-01T08:27:15.277 に答える