Дополнительная функция обработки изображений

Нашёл функцию в старой «Галлереи» которая отлично обрабатывает уменьшаемые размеры изображений, но вот столкнулся с проблемой плохого качества уменьшаемых изображений.

Подскажите кто хорошо с этим знаком, как в эту функцию добавить нужное качество изображений или просто сделать его самым высоким..?

Стандартный обработчик всем хорош но вот размеры по максимальным виличинам он очень плохо конвертирует я эту проблему уже описывал в топике Корректное уменьшение изображений до нужных размеров, без квадрат'тирования, но там так с ней не кто до конца не помог.

Изображение исходник:


Вот такое качество изображений получается при использовании функции:
Можете увидеть что там расплывается фон и качество очень страдает.

Представляю саму function обработчика:
function func_img_resize_ovimovies($sFileSrc,$sDirDest,$sFileDest,$iWidthMax,$iHeightMax,$iWidthDest=null,$iHeightDest=null,$bForcedMinSize=true) {
	if (!($aSize=getimagesize($sFileSrc))) {		
		return false;
	}	
	$img_src=false;
	switch ($aSize['mime']) {
		case 'image/png':
			$img_src=imagecreatefrompng($sFileSrc);
			$sFileDest.='.png';
			break;
		case 'image/gif':
			$img_src=imagecreatefromgif($sFileSrc);
			$sFileDest.='.gif';
			break;
		case 'image/jpeg':
			$img_src=imagecreatefromjpeg($sFileSrc);
			$sFileDest.='.jpg';
			break;
		default:
			return false;
			break;
	}
	if (!$img_src) {		
		return false;
	}
	
	$srcWidth = $aSize[0];
	$srcHeight = $aSize[1];
	
	if (($srcWidth/$srcHeight) < 1)
    {
      $ratio=$iWidthMax/$srcWidth;
    }
    else
    {
      $ratio=$iHeightMax/$srcHeight;
    }
    
    if ($ratio>1)
    {
      $ratio = 1;
    }
	
    if (($srcWidth * $ratio)>$iWidthMax)
    {
      $ratio = $iWidthMax/$srcWidth;
    }
    if (($srcHeight * $ratio)>$iHeightMax)
    {
      $ratio = $iHeightMax/$srcHeight;
    }
    $iWidthDest = $srcWidth * $ratio;
    $iHeightDest = $srcHeight * $ratio;
	
	if ($iWidthDest) {
		if (!$bForcedMinSize and ($iWidthDest>$aSize[0])) {
			$iWidthDest=$aSize[0];
		}
		$iWidthNew=$iWidthDest;
		if ($iHeightDest) {			
			$iHeightNew=$iHeightDest;
		} else {
			$iSizeRelation=$iWidthDest/$aSize[0];			
			$iHeightNew=round($iSizeRelation*$aSize[1]);
		}
	} else {
		$iWidthNew=$aSize[0];
		$iHeightNew=$aSize[1];
	}
	
	$sFileFullPath = Config::Get('path.root.server').'/'.$sDirDest.'/'.$sFileDest;
	@func_mkdir(Config::Get('path.root.server'), $sDirDest);
	if ($iWidthDest and $iWidthDest!=$aSize[0]) {
		$img_dest=imagecreatetruecolor($iWidthNew,$iHeightNew);		
		imagesavealpha($img_dest,true);
		imagealphablending($img_dest,false);
		if (imagecopyresampled($img_dest,$img_src,0,0,0,0,$iWidthNew,$iHeightNew,$aSize[0],$aSize[1])) {				
			imagedestroy($img_src);
			switch ($aSize['mime']) {
				case 'image/png':
					if (imagepng($img_dest,$sFileFullPath)) {
						chmod($sFileFullPath,0666);
						return $sFileDest;
					}
					break;
				case 'image/gif':
					if (imagegif($img_dest,$sFileFullPath)) {
						chmod($sFileFullPath,0666);
						return $sFileDest;
					}
					break;
				case 'image/jpeg':
					if (imagejpeg($img_dest,$sFileFullPath)) {
						chmod($sFileFullPath,0666);
						return $sFileDest;
					}
					break;
			}
		}
	} else {
		if (copy($sFileSrc,$sFileFullPath)) {
			return $sFileDest;
		}
	}
	return false;
}

10 комментариев

avatar
В функции imagejpeg() нужно передать качество изображения от 0 до 100
Синтаксис функции вот
int imagejpeg (resource image [, string filename [, int quality]])
avatar

if (imagejpeg($img_dest,$sFileFullPath,100)) {
       chmod($sFileFullPath,0666);
       return $sFileDest;
}
avatar
Ну или вот так попробовать
function func_img_resize_ovimovies($sFileSrc,$sDirDest,$sFileDest,$iWidthMax,$iHeightMax,$iWidthDest=null,$iHeightDest=null,$bForcedMinSize=true,$iQualityJPG) {
        if (!($aSize=getimagesize($sFileSrc))) {                
                return false;
        }       
        $img_src=false;
        switch ($aSize['mime']) {
                case 'image/png':
                        $img_src=imagecreatefrompng($sFileSrc);
                        $sFileDest.='.png';
                        break;
                case 'image/gif':
                        $img_src=imagecreatefromgif($sFileSrc);
                        $sFileDest.='.gif';
                        break;
                case 'image/jpeg':
                        $img_src=imagecreatefromjpeg($sFileSrc);
                        $sFileDest.='.jpg';
                        break;
                default:
                        return false;
                        break;
        }
        if (!$img_src) {                
                return false;
        }
        
        $srcWidth = $aSize[0];
        $srcHeight = $aSize[1];
        
        if (($srcWidth/$srcHeight) < 1)
    {
      $ratio=$iWidthMax/$srcWidth;
    }
    else
    {
      $ratio=$iHeightMax/$srcHeight;
    }
    
    if ($ratio>1)
    {
      $ratio = 1;
    }
        
    if (($srcWidth * $ratio)>$iWidthMax)
    {
      $ratio = $iWidthMax/$srcWidth;
    }
    if (($srcHeight * $ratio)>$iHeightMax)
    {
      $ratio = $iHeightMax/$srcHeight;
    }
    $iWidthDest = $srcWidth * $ratio;
    $iHeightDest = $srcHeight * $ratio;
        
        if ($iWidthDest) {
                if (!$bForcedMinSize and ($iWidthDest>$aSize[0])) {
                        $iWidthDest=$aSize[0];
                }
                $iWidthNew=$iWidthDest;
                if ($iHeightDest) {                     
                        $iHeightNew=$iHeightDest;
                } else {
                        $iSizeRelation=$iWidthDest/$aSize[0];                   
                        $iHeightNew=round($iSizeRelation*$aSize[1]);
                }
        } else {
                $iWidthNew=$aSize[0];
                $iHeightNew=$aSize[1];
        }
        
        $sFileFullPath = Config::Get('path.root.server').'/'.$sDirDest.'/'.$sFileDest;
        @func_mkdir(Config::Get('path.root.server'), $sDirDest);
        if ($iWidthDest and $iWidthDest!=$aSize[0]) {
                $img_dest=imagecreatetruecolor($iWidthNew,$iHeightNew);         
                imagesavealpha($img_dest,true);
                imagealphablending($img_dest,false);
                if (imagecopyresampled($img_dest,$img_src,0,0,0,0,$iWidthNew,$iHeightNew,$aSize[0],$aSize[1])) {                                
                        imagedestroy($img_src);
                        switch ($aSize['mime']) {
                                case 'image/png':
                                        if (imagepng($img_dest,$sFileFullPath)) {
                                                chmod($sFileFullPath,0666);
                                                return $sFileDest;
                                        }
                                        break;
                                case 'image/gif':
                                        if (imagegif($img_dest,$sFileFullPath)) {
                                                chmod($sFileFullPath,0666);
                                                return $sFileDest;
                                        }
                                        break;
                                case 'image/jpeg':
                                        if (imagejpeg($img_dest,$sFileFullPath,$iQualityJPG)) {
                                                chmod($sFileFullPath,0666);
                                                return $sFileDest;
                                        }
                                        break;
                        }
                }
        } else {
                if (copy($sFileSrc,$sFileFullPath)) {
                        return $sFileDest;
                }
        }
        return false;
}
avatar
Большое спасибо vetatto, буду сейчас тестировать по Вашему примеру, если появятся ещё вопросы напишу..;)
avatar
Это больше спасибо netlanc'у он в другом топике мне это подсказал
avatar
а что мешает 10 строчек и не использовать базовый функционал, ресайза?
avatar
*дописать 10 строчек
avatar
Мешает не знание в данной области…
И думаю лучше даже будет этих 2 обработчика совмещать (стандартный и представленный), так как в некоторых случаях более подходит стандартный…
avatar
я так понимаю Вам нужно пропорциональное уменьшение изображений при заданых максимльных величинах ширины и высоты. так?
avatar
да вы совершенно правы..:)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.