2012-11-06 24 views
7

GD kitaplığı kullanılarak yeniden boyutlandırılan PNG görüntülerinin neden orijinalinden daha büyük boyutta olduğu konusunda kafam karıştı.PNG görüntüsünü neden orijinal görüntüden çok daha büyük boyutlandırılıyor?

// 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; 
} 

Sonra MySQL veritabanında blob $ newImageToSave kaydedin:

Bu

ben görüntüyü yeniden boyutlandırmak için kullanıyorum kodudur.

Alfa kanalını engellemeye çalıştım ve beyaz arka planı ayarladım, dosya boyutunda önemli bir değişiklik olmadı. "Sıkıştırma" parametrelerini (0'dan 9'a) ayarlamayı denedim, ancak yine de orijinalden daha büyük.

Örnek aldı bu image (1058px * 1296px) ve 900px * 1102px için yeniden boyutlandırılır.

Orjinal Dosya: 328 KB
PNG (0): 3,79 MB
PNG (5): 564 KB
PNG (9): 503 KB

Herhangi ipucu Bu sonuçlar şunlardır Yeniden boyutlandırılan görüntünün dosya boyutunda küçültülmesi nasıl değerlendirilir.

-

PS: Ben bit derinliği olabilir, ama gördüğünüz gibi boyutlandırılan görüntü 24 bit ise, örneğin görüntü yukarıda, 32 bit vardır düşündük.

+1

Sen sıkıştırma faktörü için 5' 'kullanıyoruz. 9'u dene ve ne olduğunu görün. –

+0

Yeni boyutlu boyutunuzun sıkıştırmanın etkili olmamasına neden olan şey olup olmadığını merak ediyorum. Hangi dosya boyutuna farklı hedef boyutların sıkıştırılacağını görmek ilginç olurdu. Örneğin, hedef boyutlar orijinal boyutun yarısıysa, yeni dosya boyutu nedir? –

+0

@MarcB Hemen yukarıya bakınız: PNG (9): 503 KB –

cevap

10

Görüntüyü küçültmek için çağıran işlevlerin çoğunu yapmazsınız, imagefill, imagealphablending vb. Daha yüksek dosya boyutuna neden olabilir.

şeffaf kullanımını imagecreate yerine imagecreatetruecolor Bakım ve sadece basit bir yeniden boyutlandırmak

$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; 
} 

Final Boyutu yapmak için: 164KB

+0

belgesine bakın. –

+0

Mükemmel, teşekkür ederim! Orijinal: 328KB → Kodunuz ile yeniden boyutlandırılır: 163KB. ... Almamam gereken tek şey, şeffaf kanalın neden daha önce hayatta kaldığı, önceki bazı kodların da siyah kalmasıdır. –

+0

Açıklamama bakın ..... 'imagecreate' kullanıyorsunuz ... boş bir sayfa var ... – Baba

İlgili konular