2012-11-06 16 views
7

Jestem dość zdezorientowany, dlaczego obrazy PNG, które zostały zmienione przy użyciu biblioteki GD, są znacznie większe niż oryginał.Dlaczego obraz ze zmienionym rozmiarem PNG jest o wiele większy niż oryginalny obraz?

Jest to kod używam na zmianę rozmiaru obrazu:

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

Potem zaoszczędzić $ newImageToSave jako blob w bazie danych mysql.

Próbowałem zapobiec kanałowi alfa i po prostu ustawić białe tło, bez znaczących zmian w rozmiarze pliku. Próbowałem ustawić parametry "kompresji" (od 0 do 9), ale wciąż większe od oryginału.

Przykład
I wziął to image (1058px * 1296px) i zmniejszane do 900px * 1102px. Są to wyniki:

oryginalnego pliku: 328 KB
PNG (0): 3,79 MB
PNG (5): 564 KB
PNG (9): 503 KB

Każda końcówka jak docenić rozmiar zmniejszonego obrazu w rozmiarze pliku.

-

PS: Myślałem, że to może być głębokość nieco, ale jak widać, na przykładzie obrazu powyżej ma 32 bitów, natomiast zmienionym rozmiarze wynosi 24 bitów.

+1

używasz '5' dla współczynnika kompresji. Spróbuj '9' i zobacz, co się stanie. –

+0

Zastanawiam się, czy twój nowy rozmiar wymiarowy nie powoduje, że kompresja nie jest tak skuteczna. Interesujące byłoby zobaczyć, jakie wymiary docelowe kompresowałyby się do rozmiaru pliku. Na przykład, jeśli wymiary docelowe stanowią połowę oryginalnego rozmiaru, jaki jest nowy rozmiar pliku. –

+0

@MarcB Po prostu patrz wyżej: PNG (9): 503 KB –

Odpowiedz

10

Nie większość funkcji, do których dzwonisz, aby zredukować obraz, imagefill, imagealphablending itp. Może spowodować zwiększenie rozmiaru pliku.

aby utrzymać przejrzyste wykorzystanie imagecreate zamiast imagecreatetruecolor i po prostu zrobić prosty Resize

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

ostateczny rozmiar: 164KB

+0

w porządku, testuj teraz. –

+0

Doskonale, dziękuję! Oryginał: 328 KB → Rozmiar zmieniony przy użyciu kodu: 163 KB. ... Jedyne, czego nie dostaję, dlaczego przezroczysty kanał przetrwał teraz, z jakimś wcześniejszym kodem, który stał się czarny. –

+0

Zobacz moje wyjaśnienie ..... używasz 'imagecreate' teraz ... jego pusty łupek ... – Baba

Powiązane problemy