ФорумПрограммированиеПыхнуть хотите?Готовые решения → Image resizer

Image resizer

  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 11 марта 2008 г. 21:49

    Довольно часто приходилось слышать вопросы о том, как ресайзнуть имагу на сервере средствами PHP

    Вот как-бы решил поделится той ф-ей, которую использую я….
    Одно из очень хороших ее свойств, это то что после ресайза имагов типа gif и png , у них остается прозрачность.

    function smart_resize_image( $file, $width = 0, $height = 0, $proportional = false, $output = 'file', $delete_original = true, $use_linux_commands = false )
       {
    if ( $height <= 0 && $width <= 0 )
    {
    return false;
    }

    $info = getimagesize($file);
    $image = '';

    $final_width = 0;
    $final_height = 0;
    list($width_old, $height_old) = $info;
    if ($proportional)
    {
    if ($width == 0) $factor = $height/$height_old;
    elseif ($height == 0) $factor = $width/$width_old;
    else $factor = min ( $width / $width_old, $height / $height_old);
    $final_width = round ($width_old * $factor);
    $final_height = round ($height_old * $factor);
    }
    else
    {
    $final_width = ( $width <= 0 ) ? $width_old : $width;
    $final_height = ( $height <= 0 ) ? $height_old : $height;
    }

    switch ($info[2])
    {
    case IMAGETYPE_GIF:
    $image = imagecreatefromgif($file);
    break;
    case IMAGETYPE_JPEG:
    $image = imagecreatefromjpeg($file);
    break;
    case IMAGETYPE_PNG:
    $image = imagecreatefrompng($file);
    break;
    default:
    return false;
    }

    $image_resized = imagecreatetruecolor( $final_width, $final_height );

    if ( ($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) )
    {
    $trnprt_indx = imagecolortransparent($image);

    if ($trnprt_indx >= 0)
    {  

    $trnprt_color = imagecolorsforindex($image, $trnprt_indx);


    $trnprt_indx = imagecolorallocate($image_resized, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);


    imagefill($image_resized, 0, 0, $trnprt_indx);


    imagecolortransparent($image_resized, $trnprt_indx);
    }


    elseif ($info[2] == IMAGETYPE_PNG)
    {

    imagealphablending($image_resized, false);


    $color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);


    imagefill($image_resized, 0, 0, $color);


    imagesavealpha($image_resized, true);
    }
    }

    imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $final_width, $final_height, $width_old, $height_old);

    if ( $delete_original )
    {
    if ( $use_linux_commands )
    exec('rm '.$file);
    else
    @unlink($file);
    }

    switch ( strtolower($output) )
    {
    case 'browser':
    $mime = image_type_to_mime_type($info[2]);
    header("Content-type: $mime");
    $output = NULL;
    break;
    case 'file':
    $output = $file;
    break;
    case 'return':
    return $image_resized;
    break;
    default:
    break;
    }

    switch ($info[2])
    {
    case IMAGETYPE_GIF:
    imagegif($image_resized, $output);
    break;
    case IMAGETYPE_JPEG:
    imagejpeg($image_resized, $output);
    break;
    case IMAGETYPE_PNG:
    imagepng($image_resized, $output);
    break;
    default:
    return false;
    }

    return true;
    }
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 11 марта 2008 г. 23:29, спустя 1 час 40 минут 2 секунды

    повтор на втором игроке
    переношу в готовые решения
    все умрут, а я изумруд
  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 12 мая 2008 г. 1:06, спустя 61 день 36 минут

    Хмм.. а вот что эта функция возвращает?
    И сразу что бы не переспрашивать, как её юзать?
    допустим что бы получались изображения 150*100 и оригинал не удалялся.

    Заранее спс.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 12 мая 2008 г. 10:37, спустя 9 часов 31 минуту 17 секунд

    Имагик рулит. Ad подтвердит.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 12 мая 2008 г. 14:29, спустя 3 часа 52 минуты 8 секунд

    что бы получались изображения 150*100 и оригинал не удалялся


    я думал, что я вроде разборчиво написал имена всех переменных…

    smart_resize_image( $path_to_file, 150, 100, $delete_original = false );
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 13 мая 2008 г. 0:12, спустя 9 часов 43 минуты 22 секунды

    vasa_c, рулит ImageMagick, а IMagick всего лишь апи… плоходокументированное сцуко :))
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 30 мая 2009 г. 10:37, спустя 382 дня 10 часов 24 минуты

    люди а как сделать чтоб если картинка допустим меньше чем 150х100 то чтоб не ресайзилась?
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 30 мая 2009 г. 10:47, спустя 10 минут 8 секунд


    люди а как сделать чтоб если картинка допустим меньше чем 150х100 то чтоб не ресайзилась?
    что такое условные операторы не знаешь ?
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 30 мая 2009 г. 10:52, спустя 4 минуты 31 секунду

    делал так if ( $height <= 150 && $width <= 100 ) - непрокатило
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 30 мая 2009 г. 10:53, спустя 56 секунд

    покажи как ты получаешь $height и $width
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 30 мая 2009 г. 10:54, спустя 1 минуту 13 секунд

    это в нутри функции твоей вместо 0 0 подставил 150 и 100)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 30 мая 2009 г. 10:57, спустя 3 минуты 8 секунд


    это в нутри функции твоей вместо 0 0 подставил 150 и 100)
    жесть))))
    конечно не работает)))
    ты хоть видел какие ты переменные берешь, т.е. откуда они приходят ?
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 30 мая 2009 г. 10:58, спустя 57 секунд

    а во-вторых в ф-ии эти проверки делать не надо
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 30 мая 2009 г. 11:34, спустя 36 минут 15 секунд

    а как надо?
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 30 мая 2009 г. 11:52, спустя 17 минут 47 секунд

    все. нашёл. getimagesize();

Пожалуйста, авторизуйтесь, чтобы написать комментарий!