Сжатие PNG

У меня есть этот кусок кода для загрузки изображений. Делает миниатюры с расширением PNG со сжатием 9 уровня, но изображения выглядят не очень хорошо. Я хочу всего -50% или чуть больше сжатия PNG с прозрачностью.

$path_thumbs = "../pictures/thumbs/";
$path_big = "../pictures/";
$img_thumb_width = 140; //
$extlimit = "yes";
$limitedext = array(".gif",".jpg",".png",".jpeg",".bmp");
$file_type = $_FILES['image']['type'];
$file_name = $_FILES['image']['name'];
$file_size = $_FILES['image']['size'];
$file_tmp = $_FILES['image']['tmp_name'];

if(!is_uploaded_file($file_tmp)){
echo "choose file for upload!. <br>--<a href=\"$_SERVER[PHP_SELF]\">return</a>";
exit();
}

$ext = strrchr($file_name,'.');
$ext = strtolower($ext);
if (($extlimit == "yes") && (!in_array($ext,$limitedext))) {
echo "dissallowed!  <br>--<a href=\"$_SERVER[PHP_SELF]\">return</a>";
exit();
}

$getExt = explode ('.', $file_name);
$file_ext = $getExt[count($getExt)-1];
$rand_name = md5(time());
$rand_name= rand(0,10000);
$ThumbWidth = $img_thumb_width;

if($file_size){
if($file_type == "image/pjpeg" || $file_type == "image/jpeg"){
$new_img = imagecreatefromjpeg($file_tmp);
}elseif($file_type == "image/x-png" || $file_type == "image/png"){
$new_img = imagecreatefrompng($file_tmp);
}elseif($file_type == "image/gif"){
$new_img = imagecreatefromgif($file_tmp);
}

list($width, $height) = getimagesize($file_tmp);
$imgratio = $width/$height;

if ($imgratio>1){
$newwidth = $ThumbWidth;
$newheight = $ThumbWidth/$imgratio;
}else{
$newheight = $ThumbWidth;
$newwidth = $ThumbWidth*$imgratio;
}
if (@function_exists(imagecreatetruecolor)){
$resized_img = imagecreatetruecolor($newwidth, $newheight);
}else{
die("Error: Please make sure you have GD library ver 2+");
}
imagecopyresized($resized_img, $new_img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
ImagePng ($resized_img, "$path_thumbs/$rand_name.$file_ext,9");
ImageDestroy ($resized_img);
ImageDestroy ($new_img);
}

move_uploaded_file ($file_tmp, "$path_big/$rand_name.$file_ext");

0

Решение

Для лучшего качества измененного изображения, вы должны использовать imagecopyresampled инстред imagecopyresized.

Для прозрачности изображения вы должны посмотреть на imagesavealpha.
Чтобы это работало, вам нужно включить его, прежде чем изменить размер изображения, а также отключить альфа-смешивание. Лучше сказать сразу после imagecreatetruecolor,

$resized_img = imagecreatetruecolor($newwidth, $newheight);
imagealphablending($resized_img, false);
imagesavealpha($resized_img, true);

Что касается размера, у вас есть опечатка в вашем коде

ImagePng ($resized_img,"$path_thumbs/$rand_name.$file_ext,9");

должно быть

ImagePng ($resized_img, "$path_thumbs/$rand_name.$file_ext", 9);

Вы помещаете свой параметр уровня сжатия в имя файла вместо функции.

И уровень сжатия здесь не означает, что он уменьшит размер вашего файла. Это компромисс между скоростью и размером файла.
Существует предел, насколько вы можете сжать файл без потерь.
Если размер файла является проблемой, вы должны сжать его с потерями, как JPEG.

1

Другие решения

Я думаю (я не проверял), что вы должны использовать функцию imagecopyresampled вместо imagecopyresize. Я думаю, что imagecopyresampled имеет более высокое качество. Вы также можете начать с помощью imagecreatetruecolor

0

По вопросам рекламы [email protected]