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.
używasz '5' dla współczynnika kompresji. Spróbuj '9' i zobacz, co się stanie. –
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. –
@MarcB Po prostu patrz wyżej: PNG (9): 503 KB –