2012-03-23 2 views
3

Я сжатия изображения, используя следующий класс ..сжатия изображений в PHP

<?php 
class SimpleImage { 

var $image; 
var $image_type; 

function load($filename) { 

    $image_info = getimagesize($filename); 
    $this->image_type = $image_info[2]; 
    if($this->image_type == IMAGETYPE_JPEG) { 

    $this->image = imagecreatefromjpeg($filename); 
    } elseif($this->image_type == IMAGETYPE_GIF) { 

    $this->image = imagecreatefromgif($filename); 
    } elseif($this->image_type == IMAGETYPE_PNG) { 

    $this->image = imagecreatefrompng($filename); 
    } 
} 
function save($filename,$image_type=IMAGETYPE_JPEG,$compression=75,$permissions=null){ 

    if($image_type == IMAGETYPE_JPEG) { 
    imagejpeg($this->image,$filename,$compression); 
    } elseif($image_type == IMAGETYPE_GIF) { 

    imagegif($this->image,$filename); 
    } elseif($image_type == IMAGETYPE_PNG) { 

    imagepng($this->image,$filename); 
    } 
    if($permissions != null) { 

    chmod($filename,$permissions); 
    } 
} 
function output($image_type=IMAGETYPE_JPEG) { 

    if($image_type == IMAGETYPE_JPEG) { 
    imagejpeg($this->image); 
    } elseif($image_type == IMAGETYPE_GIF) { 

    imagegif($this->image); 
    } elseif($image_type == IMAGETYPE_PNG) { 

    imagepng($this->image); 
    } 
} 
function getWidth() { 

    return imagesx($this->image); 
} 
function getHeight() { 

    return imagesy($this->image); 
} 
function resizeToHeight($height) { 

    $ratio = $height/$this->getHeight(); 
    $width = $this->getWidth() * $ratio; 
    $this->resize($width,$height); 
} 
function resizeToWidth($width) { 
    $ratio = $width/$this->getWidth(); 
    $height = $this->getheight() * $ratio; 
    $this->resize($width,$height); 
} 
function scale($scale) { 
    $width = $this->getWidth() * $scale/100; 
    $height = $this->getheight() * $scale/100; 
    $this->resize($width,$height); 
} 
function resize($width,$height) { 
    $new_image = imagecreatetruecolor($width, $height); 
    imagecopyresampled($new_image,$this->image,0,0,0,0,$width,$height,$this->getWidth(),$this->getHeight()); 
    $this->image = $new_image; 
}  

} 

?> 

И мой PHP код выглядит ..

include_once(ROOT.'/library/SimpleImage.php') 
$image = new SimpleImage(); 
$image->load($image_name); 
$image->resizeToWidth(100); 
$image->save($image_name); 

Теперь проблема в том, что мои изображения становятся сжаты, но их оригинальная цветовая комбинация теряется ... Не знаю, что делать .. ??

Просьба предложить другой класс для сжатия изображения.

+0

Что вы подразумеваете под комбинацией цветов? Какой образ вы пытаетесь преобразовать? (jpg/png?) –

+0

Вам нужно обрабатывать все форматы изображений или вы можете просто использовать сжатие jpeg? – Luc

+1

Сжатие и изменение размера не совпадают. Какой вы хотите? – slash197

ответ

3

Это функция, которую я давно закодировал, она не очень оптимизирована, но она должна сделать трюк. Работает для различных типов mime и позволяет сохранить измененное изображение в новом месте. Вы можете легко упростить его, если вам нужно меньше функций.

public function resizePicture($path, $new_path, $new_width, $new_height, $proportion = false) { 
    $size = getimagesize($path); 
    $x = 0; 
    $y = 0; 

    switch($size['mime']) { 
     case 'image/jpeg': 
      $picture = imagecreatefromjpeg($path); 
     break; 
     case 'image/png': 
      $picture = imagecreatefrompng($path); 
     break; 
     case 'image/gif': 
      $picture = imagecreatefromgif($path); 
     break; 
     default: 
      return false; 
     break; 
    } 

    $width = $size[0]; 
    $height = $size[1]; 

    $frame = imagecreatetruecolor($new_width, $new_height); 
    if($size['mime'] == 'image/jpeg') { 
     $bg = imagecolorallocate($frame, 255, 255, 255); 
     imagefill($frame, 0, 0, $bg); 
    } else if($size['mime'] == 'image/gif' or $size['mime'] == 'image/png') { 
     imagealphablending($picture, false); 
     imagesavealpha($picture, true); 
     imagealphablending($frame, false); 
     imagesavealpha($frame, true); 
    } 

    if($width < $new_width and $height < $new_height) { 
     $x = ($new_width - $width)/2; 
     $y = ($new_height - $height)/2; 
     imagecopy($frame, $picture, $x, $y, 0, 0, $width, $height); 
    } else { 
     if($proportion and $width != $height) { 
      if($width > $height) { 
       $old_height = $new_height; 
       $new_height = $height * $new_width/$width; 
       $y = abs($old_height - $new_height)/2; 
      } else { 
       $old_width = $new_width; 
       $new_width = $width * $new_height/$height; 
       $x = abs($old_width - $new_width)/2; 
      } 
     } 
     imagecopyresampled($frame, $picture, $x, $y, 0, 0, $new_width, $new_height, $width, $height); 
    } 

    switch($size['mime']) { 
     case 'image/jpeg': 
      imagejpeg($frame, $new_path, 85); 
     break; 
     case 'image/png': 
      imagepng($frame, $new_path, 8); 
     break; 
     case 'image/gif': 
      imagegif($frame, $new_path); 
     break; 
     default: 
      return false; 
     break; 
    } 
} 
+0

Благодаря @Ronan ... Я проверю это .. –

+0

Эй @Ronan это работает .. Но некоторые изображения не получают размер ... А также обратно землю некоторых изображений также получают изменения ... Не могли бы вы устранить проблему. Спасибо ... –

+0

В каком случае вы испытываете эти проблемы? (исходное изображение размер/новый размер изображения/тип mime и т. д.) – Ronan

0

Я использую SimpleImage.php и найти его полезным небольшой скрипт, но я должен был изменить значение $ сжатие до 100 в функции энергосбережения.

Возможно, сжатие некоторых форматов уменьшает количество цветов, но, установив $ compression на 100, вы скажете сценарий «Не сжимайте!». После этого изображения выглядят так, как они предполагают.

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