Шустрый

Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.11.2006
Репутация: нет Всего: нет
|
Хочу добиться нормальных превью к фоткам. Под нормальными я подразумеваю превью одинакового размера, но не квадратного (160x250, например). Получается надо из центра оригинала вырезать нужную область. Разумеется, нах писать с нуля, если за нас уже все написано. Вот значит, я нашел функцию и слегка ее модифицировал: Код | function thumbnails($f, $p, $t, $s, $q, $w, $h) { // f - имя файла // w - требуемая ширина картинки // q - качество сжатия jpeg // s - выводить ли надпись // t - формат: 0 - без изменения, 1 - пропорциональный, 2- фиксированный, 3 - квадратный кусок if (empty($p)) die("No thumbnail name in \$p"); list($width, $height, $type, $attr) = @getimagesize($f); if (!$type) $type = 3; //------------------------------- // // вывод без изменения // применяем в случае, если нужно // только нанести надпись // //------------------------------- if (($t == 0)&&(file_exists($f))) { switch ($type) { case 1: header("Content-type: image/gif"); $dest = imagecreatefromgif($f) or die ("Cannot Initialize new GD image stream"); break; case 2: header("Content-type: image/jpeg"); $dest = imagecreatefromjpeg($f) or die ("Cannot Initialize new GD image stream"); break; case 3: header("Content-type: image/png"); $dest = imagecreatefrompng($f) or die ("Cannot Initialize new GD image stream"); break; } if (!$s) { @readfile($f); exit; } $str = "58region.ru"; $w_dest = imagesx($dest); $h_dest = imagesy($dest); $x_text = $w_dest-70; $y_text = $h_dest-15; $white = imagecolorallocate($dest, 255, 255, 255); $black = imagecolorallocate($dest, 0, 0, 0); if ($s) { imagestring($dest, 2, $x_text-1, $y_text-1, $str,$black); imagestring($dest, 2, $x_text+1, $y_text+1, $str,$black); imagestring($dest, 2, $x_text+1, $y_text-1, $str,$black); imagestring($dest, 2, $x_text-1, $y_text+1, $str,$black); imagestring($dest, 2, $x_text-1, $y_text, $str,$black); imagestring($dest, 2, $x_text+1, $y_text, $str,$black); imagestring($dest, 2, $x_text, $y_text-1, $str,$black); imagestring($dest, 2, $x_text, $y_text+1, $str,$black); imagestring($dest, 2, $x_text, $y_text, $str,$white); } @imagegammacorrect($dest, 1, 1.1); @imageinterlace($dest, 1); switch ($type) { case 1: imagegif($dest); break; case 2: imagejpeg($dest,'',$q); break; case 3: imagepng($dest); break; } imagedestroy($dest); exit; } else if (($t == 0)&&(!file_exists($f))) { header("Content-type: image/png"); $src = @imagecreatefrompng("news/images/imgerr.png") or die ("Cannot Initialize new GD image stream"); imagepng($src); exit; } //-------------------------------------------- // // МАСШТАБИРОВАНИЕ // создаём исходное изображение на основе // исходного файла и определяем его размеры // //-------------------------------------------- if (!file_exists($f)) { $src = @imagecreatefrompng("resize_error.png") or die ("Cannot Initialize new GD image stream"); $s = 0; } else { switch ($type) { case 1: header("Content-type: image/gif"); $src = imagecreatefromgif($f) or die ("Cannot Initialize new GD image stream"); break; case 2: header("Content-type: image/jpeg"); $src = imagecreatefromjpeg($f) or die ("Cannot Initialize new GD image stream"); break; case 3: header("Content-type: image/png"); $src = imagecreatefrompng($f) or die ("Cannot Initialize new GD image stream"); break; } } $w_src = imagesx($src); $h_src = imagesy($src); // операции для получения пропорционального файла if ($t == 1) { $ratio = $w_src/$w; $w_dest = round($w_src/$ratio); $h_dest = round($h_src/$ratio); $dest = @imagecreatetruecolor($w_dest,$h_dest) or die("Cannot Initialize new GD image stream"); $white = imagecolorallocate($dest, 255, 255, 255); imagefill($dest,1,1,$white); imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src); } // операции для получения фиксированного файла if ($t == 2) { $dest = @imagecreatetruecolor($w,$h) or die("Cannot Initialize new GD image stream"); if ($w_src > $h_src) { imagecopyresampled($dest, $src, 0, 0, round((max($w_src,$h_src)-min($w_src,$h_src))/2), round((max($w_src,$h_src)-min($w_src,$h_src))/2), $w_src, $h_src, $w_src, $h_src); } if ($w_src < $h_src) { imagecopyresampled($dest, $src, 0, 0, round((max($w_src,$h_src)-min($w_src,$h_src))/2), round((max($w_src,$h_src)-min($w_src,$h_src))/2), $w_src, $h_src, $w_src, $h_src); } if ($w_src == $h_src) imagecopyresampled($dest, $src, 0, 0, 0, 0, $h, $h, $w_src, $w_src); } // операции для получения квадратного файла if ($t == 3) { $dest = @imagecreatetruecolor($w,$w) or die("Cannot Initialize new GD image stream"); if ($w_src > $h_src) imagecopyresampled($dest, $src, 0, 0, round((max($w_src,$h_src)-min($w_src,$h_src))/2), 0, $w, $w, min($w_src,$h_src), min($w_src,$h_src)); if ($w_src < $h_src) imagecopyresampled($dest, $src, 0, 0, 0, 0, $w, $w, min($w_src,$h_src), min($w_src,$h_src)); if ($w_src == $h_src) imagecopyresampled($dest, $src, 0, 0, 0, 0, $w, $w, $w_src, $w_src); } // нужна ли надпись if ($s == 1) { $str = "bchance.ru"; $x_text = $w_dest-70; $y_text = $h_dest-15; $white = imagecolorallocate($dest, 255, 255, 255); $black = imagecolorallocate($dest, 0, 0, 0); imagestring($dest, 2, $x_text-1, $y_text-1, $str,$black); imagestring($dest, 2, $x_text+1, $y_text+1, $str,$black); imagestring($dest, 2, $x_text+1, $y_text-1, $str,$black); imagestring($dest, 2, $x_text-1, $y_text+1, $str,$black); imagestring($dest, 2, $x_text-1, $y_text, $str,$black); imagestring($dest, 2, $x_text+1, $y_text, $str,$black); imagestring($dest, 2, $x_text, $y_text-1, $str,$black); imagestring($dest, 2, $x_text, $y_text+1, $str,$black); imagestring($dest, 2, $x_text, $y_text, $str,$white); } if (!file_exists($f)) { header("Content-type: image/png"); $black = imagecolorallocate($dest, 0, 0, 0); imagerectangle($dest,0,0,$w-1,$w-1,$black); imagepng($dest); exit; } @imagegammacorrect($dest, 1, 1.1); @imageinterlace($dest, 1); switch ($type) { case 1: imagegif($dest, $p); break; case 2: imagejpeg($dest, $p, $q); break; case 3: imagepng($dest); break; } imagedestroy($dest); imagedestroy($src); return true; } |
Трабл в том, что не получается при $t = 2 получить нормальую превью. На некоторых фотах смотрится нормально, но на некоторых совершенно ничего не разобрать, прям как мозайка. Полагаю, нужно как-то поиграть с функцией imagecopyresampled(), но я уже, наверное, все варианты перепробовал. Уж и не знаю, чего делать... Помогите, плиз.
|