2012-11-06 13 views
7

GDライブラリを使用してサイズ変更されたPNG画像のサイズが元のサイズよりはるかに大きいのはなぜか分かりません。サイズ変更されたPNGイメージが元のイメージよりもはるかに大きいのはなぜですか?

これは、私は画像のサイズを変更するために使用していたコードです:

// create image from posted file 
$src = imagecreatefrompng($file['tmp_name']); 
// get original size of uploaded image 
list($width,$height) = getimagesize($file['tmp_name']); 
if($width>$maxImgWidth) { 
    // resize the image to maxImgWidth, maintain the original aspect ratio 
    $newwidth = $maxImgWidth; 
    $newheight=($height/$width)*$newwidth; 
    $newImage=imagecreatetruecolor($newwidth,$newheight); 

    // fill transparent with white 
    /*$white=imagecolorallocate($newImage, 255, 255, 255); 
    imagefill($newImage, 0, 0, $white);*/ 

    // the following is to keep PNG's alpha channels 
    // turn off transparency blending temporarily 
    imagealphablending($newImage, false); 
    // Fill the image with transparent color 
    $color = imagecolorallocatealpha($newImage,255,255,255,127); 
    imagefill($newImage, 0, 0, $color); 
    // restore transparency blending 
    imagesavealpha($newImage, true); 

    // do the image resizing by copying from the original into $newImage image 
    imagecopyresampled($newImage,$src,0,0,0,0,$newwidth,$newheight,$width,$height); 

    // write image to buffer and save in variable 
    ob_start(); // Stdout --> buffer 
    imagepng($newImage,NULL,5); // last parameter is compression 0-none 9-best (slow), see also http://www.php.net/manual/en/function.imagepng.php 
    $newImageToSave = ob_get_contents(); // store stdout in $newImageToSave 
    ob_end_clean(); // clear buffer 
    // remove images from php buffer 
    imagedestroy($src); 
    imagedestroy($newImage); 
    $resizedFlag = true; 
} 

それから私は、mysqlデータベースのBLOBとして$ newImageToSaveを保存します。

私はアルファチャンネルを防ぎ、白い背景を設定しましたが、ファイルサイズに大きな変化はありませんでした。私は "圧縮"パラメータ(0〜9)を設定しようとしましたが、元のサイズよりも大きくなりました。

例は、私が取ったこのimage(1058px * 1296px)と900px * 1102pxにそれをリサイズ。

オリジナルファイル:328キロバイト
PNG(0):3,79 MB
PNG(5):564キロバイト
PNG(9):503キロバイト

どれ先端これらは結果ですリサイズされた画像をファイルサイズを小さくする方法

-

PS:リサイズ画像は24ビットであるのに対し、私はそれはビット深度であると考えていたが、あなたが見ることができるように、例えば、画像は、上記の32ビットを有します。

+1

あなたは圧縮率のために '5'を使用していることを。 '9'を試して、何が起こるか見てみましょう。 –

+0

あなたの新しい次元の大きさが圧縮を効果的ではないものにしているのではないかと思います。異なるターゲット・ディメンションがどのファイル・サイズに圧縮されるかを知ることは興味深いでしょう。たとえば、ターゲットディメンションが元のサイズの半分の場合、新しいファイルサイズは何ですか。 –

+0

@MarcB上記参照:PNG(9):503 KB –

答えて

10

イメージを縮小するために呼び出す関数のほとんどは、imagefillimagealphablendingなどのファイルサイズが大きくなる可能性があります。

透明使用imagecreateの代わりimagecreatetruecolorを維持し、単純なリサイズ

$file['tmp_name'] = "wiki.png"; 
$maxImgWidth = 900; 
// create image from posted file 
$src = imagecreatefrompng($file['tmp_name']); 
// get original size of uploaded image 
list($width, $height) = getimagesize($file['tmp_name']); 
if ($width > $maxImgWidth) { 
    $newwidth = $maxImgWidth; 
    $newheight = ($height/$width) * $newwidth; 
    $newImage = imagecreate($newwidth, $newheight); 
    imagecopyresampled($newImage, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 
    imagepng($newImage, "wiki2.png", 5); 
    imagedestroy($src); 
    imagedestroy($newImage); 
    $resizedFlag = true; 
} 

最終的な大き行うには:164キロバイト

+0

今すぐテストしてください。 –

+0

優秀、ありがとう!オリジナル:328KB→コードでサイズ変更:163KB ...私が得ることができない唯一の事は、透明なチャンネルがなぜ生き残ったのか、それ以前のコードでは黒くなったのです。 –

+0

私の説明を見てください.....あなたは今 'imagecreate'を使っています...その空白のスレート... – Baba

関連する問題