Поддержка Проблемы и решения Загрузка и обрезка изображения

  • Добрый день все!
    Вот такой вопрос:

    1. Мне необходимо обрезать изображение до размера 442*142, сохраняя пропорции. Функция image_make_intermediate_size() по какой-то причине уменьшает ширину до 189. Как лучше поступить в данной ситуации. Возможно есть какие-то другие решения.
    2. Для загрузки на сервер использую функцию wp_handle_upload() (вызывается в $file=handle_image_upload($upload);). Эта функция автоматом помещает файл в папку uploads, а мне хотелось бы их загружать в свою папку с именем плагина в uploads. Посмотрела реализацию wp_handle_upload() , выходит, что нужно использовать фильтр wp_handle_upload, чтобы переопределить путь. Правильно ли я рассуждаю или может есть способ проще?

    Делаю так:

    // if file uploaded
    if ($upload['tmp_name']) {
       // handle uploaded image
        $file=handle_image_upload($upload);
           if ($file)
           {
              $image_url=$file['url'];//ссылка на загруженный оригинал
        $resized = image_make_intermediate_size( $file['file'], 442, 142 );
    
              if ($resized)
              {
                  $image_src = $uploads['url'] .'/'.$resized['file'];
              }
              else {
    	     $image_src = $image_url;
    	     echo "Произошла ошибка: размеры изображения не изменены.";
              }
              $image_uploaded = true;
    
          } else //end if $file
    	$error = __('Ошибка: расширение загружаемого файла не соттветствует разрешенным расширениям: gif, jpeg and png.');
    
       } else {//end if file upload
           __('Ошибка: файл не загружен, см. код ошибки.');

    Заранее спасибо.

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    1. У image_make_intermediate_size() есть четвёртый параметр: $crop. Предполагаю, что в данном случае нужно указать там true. Или, если высота не должна быть фиксированной, указать для неё большую величину. Изображение масштабируется таким образом, чтобы укладываться в измерение с максимальной величиной.
    2. Как вариант, можно использовать фильтр upload_dir. На входе массив с элементами path и url — нужно изменить их оба.

    Спасибо за ответ!
    1. $crop пробовала — не подходит , потому что он именно обрезает изображение, хотя и делает его точно соответствующим размерам. а мне нужно масштабируемое. Просто искала функцию, которая к примеру обрезает по какой-то одной величине: высоте или ширине. Но ничего не нашла.

    Или, если высота не должна быть фиксированной, указать для неё большую величину.

    Указала 1000 вместо 142, работает как надо, но я не понимаю почему так происходит. Объясните, пожалуйста, если это не трудно.

    Изображение масштабируется таким образом, чтобы укладываться в измерение с максимальной величиной.

    То есть если я гружу картинку с размером 600х400, в функции обрезки стоит 442х1000, то максимальное измерение = 1000 , а дальше что???

    2. Буду пробовать.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    В предложенном примере картинка будет обрезана до 442×295. Если бы заданная высота была меньше (например, 200), то для сохранения пропорций пришлось бы уменьшить ширину, что и происходило в начале темы.

    Изображение масштабируется таким образом, чтобы укладываться в измерение с максимальной величиной.

    Я не понимаю, что это значит. Как получилось 295? Что в моем примере принимается за макисмальную величину.

    До меня дошло :). Отношение ширины к высоте для картинки 600х400, равно 1,5. Соответственно, чтобы сохранить эту пропорцию, новая высота получается 442/1,5 = 295.
    Но вопрос все равно остался, какую роль тут играет большой размер высоты? Объясните ,пожалуйста, если можно.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Похоже, я перепутал — не с максимальной, а минимальной величиной 🙂 Картинка после уменьшения должна укладываться в заданные размеры. Рассмотрим ту же картинку 600×400, но при уменьшении до 442×142 — она должна уложиться по высоте в 142 пикселя, следовательно (при условии сохранения пропорций) нужно уменьшить ширину до 213. Если же уменьшать до 442×1000, то по высоте она заведомо укладывается, и ограничением остаётся только ширина.

    Спасибо, поняла наконец-то, после долгих размышлений :).

    И последний вопрос: значит нет спец. функций в WP, чтоб обрезать по одному параметру? Вообще, где можно посмотреть все функции для работы с изображениями. Я просмотрела файл:\wp\wp-includes\media.php, потому что там объявляется image_make_intermediate_size() и ничего соответствующего не нашла.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Если там нет — скорее всего, нет 🙂

    Спасибо еще раз, Вы мне очень помогли.

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • Тема «Загрузка и обрезка изображения» закрыта для новых ответов.