У меня есть этот кусок кода для загрузки изображений. Делает миниатюры с расширением 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");
Для лучшего качества измененного изображения, вы должны использовать 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.
Я думаю (я не проверял), что вы должны использовать функцию imagecopyresampled вместо imagecopyresize. Я думаю, что imagecopyresampled имеет более высокое качество. Вы также можете начать с помощью imagecreatetruecolor