Уменьшить картинку сохраняя пропорции

Тема в разделе "PHP", создана пользователем verfaa, 3 ноя 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Юзер через форму загружает фото на сайт. Если картинка по ширине больше 1920 нужно уменьшить её до ширины 1920, сохраняя пропорции, т.е. рассчитать необходимую высоту. Вот кусок кода из скрипта-обработчика:
    Код:
    if(isset($_FILES["file"])) {
                $upload = $_FILES["file"];
            }
     
    foreach ($upload['tmp_name'] as $index => $value) {
    $upload_info = GetImageSize($upload["tmp_name"][$index]); // Получаем ширину/высоту картинки
     
     
     
    $ex_arr = explode(".",$upload['name'][$index]);
    $extension = $ex_arr[count($ex_arr)-1];
    $new_file_name = substr(md5(microtime().getmypid()), 0, 8).".".$extension;
     
     
    if ($upload_info[0] > 1920) { // Если ширина картинки больше 1920 - уменьшаем её, сохраняя пропорции
        $ratio = 1920 / $upload_info[0];
        $height = $upload_info[1] * $ratio;
        $new_image = imagecreatetruecolor(1920, $height);
        $im = imagecreatefromjpeg($upload["tmp_name"][$index]);
        imagecopyresampled($new_image, $im, 0, 0, 0, 0, 1920, $height, $upload_info[0], $upload_info[1]);
     
    }
     
    copy($new_image, dirname(__FILE__).'/upload/'.$new_file_name);
     
            }
    
    Но этот код не работает - новая картинка не создаётся...

    Пробовал вместо
    Код:
        $im = imagecreatefromjpeg($upload["tmp_name"][$index]);
        imagecopyresampled($new_image, $im, 0, 0, 0, 0, 1920, $height, $upload_info[0], $upload_info[1]);
    
    написать:
    Код:
    imagecopyresampled($new_image, $upload["tmp_name"][$index], 0, 0, 0, 0, 1920, $height, $upload_info[0], $upload_info[1]);
    
    тоже не хочет работать - уменьшенная картинка не создаётся, вернее вообще никакая не создаётся.

    А если просто написать
    Код:
    copy($upload["tmp_name"][$index], dirname(__FILE__).'/upload/'.$new_file_name);
    
    то новый файл успешно создаётся в нужно папке, только естессно не уменьшенный, т.е. ошибка кроется где-то в этом участке кода:
    Код:
        $im = imagecreatefromjpeg($upload["tmp_name"][$index]);
        imagecopyresampled($new_image, $im, 0, 0, 0, 0, 1920, $height, $upload_info[0], $upload_info[1]);
     
    }
     
     
    copy($new_image, dirname(__FILE__).'/upload/'.$new_file_name);
    
    Помогите пожалуйста найти её
     
  2. SolutionFix

    SolutionFix 17 лет програмлю ;)

    Регистр.:
    20 ноя 2006
    Сообщения:
    272
    Симпатии:
    318
    99% не стоит php-gd библиотека, для debian: apt-get install php5-gd
    посмотри в phpinfo, или просто сделай var_dump($upload_info); break;
     
  3. mr.Voodoo

    mr.Voodoo Создатель

    Регистр.:
    31 мар 2008
    Сообщения:
    28
    Симпатии:
    9
    Ещё один велосипед.. зачем? Есть куча php классов для таких целей, которые работают отлично. И функция imagecopyresampled работает сама по себе очень медленно, стоит рассмотреть альтернативы.
     
  4. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    php-gd конечно же есть, дело не в ней было. А решилось всё очень просто:
    Код:
        $im = imagecreatefromjpeg($upload["tmp_name"][$index]);
        imagecopyresampled($new_image, $im, 0, 0, 0, 0, 1920, $height, $upload_info[0], $upload_info[1]);
        
        imagejpeg($new_image, dirname(__FILE__).'/uploades/".$new_file_name);
    
    на гугл ответах почти сразу дали верный ответ, а тут столько прогеров и никто не знал, странно...(
     
Статус темы:
Закрыта.