2013-11-30 3 views
1

Я создаю thumnails загруженного файла.Php Изменение размера изображения Увеличение размера изображения

если ширина и высота изображения больше 200, чем тогда, я их размер до 200 пикселей.

Вот код я использовал для этого:

if (file_exists($old_file)) { 
     $path_parts = pathinfo($old_file); 
     $extension = $path_parts['extension']; 
     $filename_path = $filepath . $filename; 
     $destination_path = $filename_path; 
     if (strtolower($extension) == "jpg" || strtolower($extension) == "jpeg") { 
      $uploadedfile = $old_file; 
      $src = imagecreatefromjpeg($uploadedfile); 
     } else if (strtolower($extension) == "png") { 
      $uploadedfile = $old_file; 
      $src = imagecreatefrompng($uploadedfile); 
     } else { 
      $uploadedfile = $old_file; 
      $src = imagecreatefromgif($uploadedfile); 
     } 
     list($width, $height) = getimagesize($uploadedfile); 
     $newwidth = $Size['width']; 
     $newheight = $Size['height']; 
     if ($width <= $newwidth && $height <= $newheight) { 
      $newwidth = $width; 
      $newheight = $height; 
      $tmp = imagecreatetruecolor($width, $height); 
     } else { 
      if ($width > $height) { 
       $newheight = ($height/$width) * $newwidth; 
       $tmp = imagecreatetruecolor($newwidth, $newheight); 
      } else { 
       $newwidth = ($width/$height) * $newheight; 
       $tmp = imagecreatetruecolor($newwidth, $newheight); 
      } 
     } 
     if ((strtolower($extension) == "png") OR (strtolower($extension) == "gif")) { 
      imagealphablending($tmp, false); 
      imagesavealpha($tmp, true); 
      $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127); 
      imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); 
     } 
     imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 
     if (strtolower($extension) == "jpg" || strtolower($extension) == "jpeg") { 
      imagejpeg($tmp, $destination_path, 100); 
     } elseif (strtolower($extension) == "png") { 
      imagepng($tmp, $destination_path, 5); 
     } else { 
      imagegif($tmp, $destination_path); 
     } 
     chmod($destination_path, 0777); 
     imagedestroy($src); 
     imagedestroy($tmp); 
     ob_flush(); 
     flush(); 
     ob_end_flush(); 
     return true; 
    } else { 
     return false; 
    } 

он повторно размер больших изображений в 200px по 200px, но размер изображения увеличивается (байт и т.д. кб увеличивается).

Я попытался загрузить файл 8kb png, а размер нового миниатюры был 28kb?

Пробовал, но прибегая к помощи не нашел ничего полезного

Спасибо.

ответ

3

Ваше исходное изображение сжато, после его разбора вы получаете истинное цветное изображение, которое несжатое. Затем вы сохраняете его с уровнем сжатия 5 (в случае PNG), что довольно низкое сжатие, таким образом, более высокий размер файла.

Попробуйте выполнить более высокое сжатие, например 9. Также попробуйте добавить комбинацию фильтров для уменьшения размера файла (http://us3.php.net/manual/en/image.constants.php look for PNG_FILTER_*).

См: http://us3.php.net/manual/en/function.imagepng.php

http://en.wikipedia.org/wiki/Portable_Network_Graphics#Compression http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_size_factors

библиотека GD не появляется предоставлять какие-либо интерфейсы, чтобы позволить вам в данном PNG низкого уровня, но теоретически вы можете узнать степень сжатия источника и фильтры, используя другие привязки или пытаясь прочитать его вручную.

http://www.libpng.org/pub/png/spec/1.2/PNG-Compression.html http://www.libpng.org/pub/png/spec/1.2/PNG-Filters.html

То же самое может произойти с JPG и GIF.

+0

но документация говорит imagesgif есть только два параметра, где проходят параметр сжатия '/ ** * (PHP 4, PHP 5)
* выводит изображение в браузер или файл * @link HTTP: // PHP. net/manual/en/function.imagegif.php * @param resource $ image * @param string $ filename [необязательно]

Путь к сохранению файла. Если не установлено или NULL, поток необработанного изображения будет выводиться напрямую.

* @return bool TRUE по успеху или FALSE при аварии. */ Функция imagegif ($ image, $ filename = null) {} ' – Ravi

+0

Вот почему я сказал * may *. В вашем примере был «png». 'gif' не должен иметь такого же эффекта, так как' gif 'либо сжаты LZW, либо нет, нет градации. Поэтому вы не должны испытывать то же самое с 'gif'. – soulseekah

+0

ОК. спасибо за объяснение. – Ravi

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