Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание красивых превью к фотам :-) 
:(
    Опции темы
DeMx
Дата 12.4.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.11.2006

Репутация: нет
Всего: нет



Хочу добиться нормальных превью к фоткам. Под нормальными я подразумеваю превью одинакового размера, но не квадратного (160x250, например). Получается надо из центра оригинала вырезать нужную область.

Разумеется, нах писать с нуля, если за нас уже все написано. smile 

Вот значит, я нашел функцию и слегка ее модифицировал:
Код
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 получить нормальую превью. На некоторых фотах смотрится нормально, но на некоторых совершенно ничего не разобрать, прям как мозайка. smile 

Полагаю, нужно как-то поиграть с функцией imagecopyresampled(), но я уже, наверное, все варианты перепробовал. Уж и не знаю, чего делать... Помогите, плиз.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Графика | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.