function img_resize($src, $width, $height, $returnpath = false, $radius = 0, $blur = false, $grayscale = false, $cut = false, $color = 0xFFFFFF, $quality = 100)
{
if (strlen($src)==0){
return false;
}
$src = $_SERVER["DOCUMENT_ROOT"] . $src;
$file_name = $width . "x" . $height . "x" . $radius;
if($blur==1){
$file_name .= "x_blur_x";
};
if($grayscale==1){
$file_name .= "x_grey_x";
};
if($cut==1){
$file_name .= "x_CUT_x";
};
$out = $_SERVER["DOCUMENT_ROOT"] . "/tmp/" . $file_name . "_" . basename($src);
// Если файл не существует
if (file_exists($out) && $returnpath==false) {
return ('');
}elseif(file_exists($out) && $returnpath!=false){
return ('/tmp/' . basename($out));
}
if (!file_exists($src)) {
return false;
}
// Получаем массив с информацией о размере и формате картинки (mime)
$size = getimagesize($src);
// Исходя из формата (mime) картинки, узнаем с каким форматом имеем дело
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
//и какую функцию использовать для ее создания
$picfunc = 'imagecreatefrom'.$format;
// Вычилсить горизонтальное соотношение
if($size[0]==0){return false;};
$gor = $width / $size[0];
// Вертикальное соотношение
$ver = $height / $size[1];
// Если не задана высота, вычислить изходя из ширины, пропорционально
if ($height == 0) {
$ver = $gor;
$height = $ver * $size[1];
}
// Так же если не задана ширина
elseif ($width == 0) {
$gor = $ver;
$width = $gor * $size[0];
}
if ($cut==false){
// Формируем размер изображения
$ratio = min($gor, $ver);
// Нужно ли пропорциональное преобразование
if ($gor == $ratio) {
$use_gor = true;
}
else{
$use_gor = false;
};
$new_width = $use_gor ? $width : floor($size[0] * $ratio);
$new_height = !$use_gor ? $height : floor($size[1] * $ratio);
$new_left = $use_gor ? 0 : floor(($width - $new_width) / 2);
$new_top = !$use_gor ? 0 : floor(($height - $new_height) / 2);
$picsrc = $picfunc($src);
// Создание изображения в памяти
$picout = imagecreatetruecolor($width, $height);
// Заполнение цветом
imagefill($picout, 0, 0, $color);
// Нанесение старого на новое
imagecopyresampled($picout, $picsrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);
}else{
// Формируем размер изображения
$ratio = max($gor, $ver);
// Нужно ли пропорциональное преобразование
if ($gor == $ratio) {
$use_gor = true;
}
else{
$use_gor = false;
};
$new_width = $use_gor ? $width : floor($size[0] * $ratio);
$new_height = !$use_gor ? $height : floor($size[1] * $ratio);
//$new_left = $use_gor ? 0 : floor(($width - $new_width) / 2);
//$new_top = $use_gor ? 0 : floor(($height - $new_height) / 2);
$new_left = $use_gor ? 0 : floor(($width - $new_width) / 2);
$new_top = !$use_gor ? 0 : floor(($height - $new_height) / 2);
$picsrc = $picfunc($src);
//die($src);
$picout = imagecreatetruecolor($width, $height);
imagefill($picout, 0, 0, $color);
imagecopyresampled($picout, $picsrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);
}
if ($grayscale==1){
for ($i = 0; $i <= 255; $i++) {
$palette[$i] = imagecolorallocate($picout, $i, $i, $i);
}
function grayscale($r, $g, $b) {
return 0.199*$r + 0.587*$g + 0.114*$b;
}
for($x = 0; $x < $width; $x++) {
for($y = 0; $y < $height; $y++) {
$rgb = imagecolorat($picout, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
imagesetpixel($picout, $x, $y, $palette[grayscale($r, $g, $b)]);
}
}
};
if($blur==1){
$gaussian = array(array(4.0, 5.0, 4.0), array(5.0, 7.0, 5.0), array(4.0, 5.0, 4.0));
imageconvolution($picout, $gaussian, 32, 0);
};
// Создание файла изображения
imagejpeg($picout, $out, $quality);
// Очистка памяти
imagedestroy($picsrc);
imagedestroy($picout);
if ($radius>0) {
$filename = $_SERVER["DOCUMENT_ROOT"] . '/tmp/' . basename($out);
$rate = 3;
$img = imagecreatefromstring(file_get_contents($filename));
imagealphablending($img, false);
imagesavealpha($img, true);
$width = imagesx($img);
$height = imagesy($img);
$rs_radius = $radius * $rate;
$rs_size = $rs_radius * 2;
$corner = imagecreatetruecolor($rs_size, $rs_size);
imagealphablending($corner, false);
$trans = imagecolorallocatealpha($corner, 255, 255, 255, 0);
imagefill($corner, 0, 0, $trans);
$positions = array(
array(0, 0, 0, 0),
array($rs_radius, 0, $width - $radius, 0),
array($rs_radius, $rs_radius, $width - $radius, $height - $radius),
array(0, $rs_radius, 0, $height - $radius),
);
foreach ($positions as $pos) {
imagecopyresampled($corner, $img, $pos[0], $pos[1], $pos[2], $pos[3], $rs_radius, $rs_radius, $radius, $radius);
}
$lx = $ly = 0;
$i = -$rs_radius;
$y2 = -$i;
$r_2 = $rs_radius * $rs_radius;
for (; $i <= $y2; $i++) {
$y = $i;
$x = sqrt($r_2 - $y * $y);
$y += $rs_radius;
$x += $rs_radius;
imageline($corner, $x, $y, $rs_size, $y, $trans);
imageline($corner, 0, $y, $rs_size - $x, $y, $trans);
$lx = $x;
$ly = $y;
}
foreach ($positions as $i => $pos) {
imagecopyresampled($img, $corner, $pos[2], $pos[3], $pos[0], $pos[1], $radius, $radius, $rs_radius, $rs_radius);
}
imagejpeg($img, $out, $quality);
imagedestroy($img);
}
if ($returnpath!=false){
return ('/tmp/' . basename($out));
}else{
return ('');
}
}
?>