2015-09-28 3 views
0

У меня есть этот кусок кода для загрузки изображений. Он создает миниатюры с расширением PNG с компрессией уровня 9, но изображения выглядят не очень хорошо. Я хочу только -50% или немного больше сжатия PNG с прозрачностью.Сжатие 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 вместо imagecopyresize. Я думаю, что imagecopyresampled имеет более высокое качество. Вы также можете начать с использования imagecreatetruecolor

1

Для лучшего качества изображения с уменьшенным разрешением вы должны использовать imagecopyresampled instread of 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.

+0

Я собираюсь использовать PNG. Можете ли вы помочь, где добавить Imagesavephpha? –

 Смежные вопросы

  • Нет связанных вопросов^_^