Intereting Posts
Как изменить размер шрифта (плагин MathJax-LaTeX)? Проводка данных от ионных до wordpress Фильтровать несколько тегов / категорий Удаленная установка не найдет родительскую тему, если задана тема Child Theme, но локальная установка Таймер на Рекомендуемый продукт – Woocommerce Обновить версию jquery Как обфускать URL-адреса каталога темы Есть ли плагин формы WordPress, который можно легко настроить для целей Google Analytics? Добавление класса к первому сообщению в пользовательском цикле с использованием фильтра post_class Пользовательский тип заголовка задается другим настраиваемым типом сообщения Петля фильтра по пользовательскому значению поля Показать изображение в качестве фонового изображения из postQuery Есть ли плагин тестирования A / B, который позволяет вам изменять заголовок, отображаемое изображение и содержимое в WordPress? Как автоматически изменить размер анимированных GIF-файлов, используемых в качестве Featured Images, без потери анимации? Как преобразовать DateTime () для отображения времени, основанного на настройке часового пояса WordPress?

Изменение размера изображения без обрезки

В настоящее время я работаю над плагином WordPress, и в нем пользователи могут загружать изображения. Я хочу, чтобы эти загруженные изображения любого размера были изменены до 100 пикселей на 100 пикселей без обрезки.

Вот часть кода, в котором выполняется изменение размера. Он работает, но не без урожая. Я надеюсь, что кто-то может помочь получить эту работу, не обрезая изображения.

Было бы лучше, если бы это было возможно с использованием только собственных функций WordPress.

$editor = wp_get_image_editor( $avatar_full_path ); if ( ! is_wp_error( $editor ) ) { $resized = $editor->resize( 100, 100, true ); if ( ! is_wp_error( $resized ) ) { $dest_file = $editor->generate_filename(); $saved = $editor->save( $dest_file ); if ( ! is_wp_error( $saved ) ) $local_avatars[$size] = str_replace( $upload_path['basedir'], $upload_path['baseurl'], $dest_file ); } } 

Solutions Collecting From Web of "Изменение размера изображения без обрезки"

Когда вы загружаете изображение в WordPress, происходит следующее:

  • Файл проверяется и перемещается в соответствующее место в папке uploads
  • Сообщение создается из типа 'attachment'
  • Это сообщение заполнено метаданными из загруженного файла
  • Для каждого определенного размера изображения копия исходного изображения создается в соответствии с тем, что определяет размер этого изображения
  • Любой код, который ссылается на это изображение, делает это с использованием идентификатора сообщения вложения, а не URL-адреса

По умолчанию вы получите:

  • Исходный файл изображения
  • «Большое» изображение
  • «Среднее» изображение
  • Изображение "Thumbnail"

Таким образом, ваш вопрос не имеет никакого смысла в этих терминах. У вас проблема XY, и вы пытаетесь найти решение для своего решения.

Вместо того чтобы пытаться изменить размер изображения до 100×100 и достичь совершенно новой проблемы, вы должны были спросить, каково решение исходной проблемы:

«Как отобразить вложение при 100×100 без обрезки?»

Ответ лежит в системе изображений.

При работе с вложением изображения API-интерфейсы для захвата исходного изображения принимают параметр размера, например:

 the_post_thumbnail('medium'); 

Что делать, если вы можете указать свой собственный размер? API позволяет передавать массив таким образом:

 the_post_thumbnail( array( 100,100 ) ); 

Но это не дает вам изображение 100×100, оно дает вам самый близкий соответствующий размер, который уже существует, с параметрами высоты и ширины 100. Он не вернется и не изменит все для вас.

Вместо этого, если мы добавим новый размер изображения и укажем, что он не использует обрезку, например:

 // add_image_size( $name, $width, $height, $crop ); add_image_size( 'Lokis100x100', 100, 100, false ); 

Затем сделайте следующее:

 the_post_thumbnail( 'Lokis100x100' ); 

Вы должны получить то, что хотите. Но есть одна важная вещь. WordPress делает свой размер при загрузке. Вам необходимо будет восстановить эти изображения или повторно загрузить изображение, чтобы оно работало на тех, которые уже находятся на сайте. Существует множество плагинов, таких как регенерирующие миниатюры, которые сделают это.

Размер изображения «Lokis100x100», указанный выше, не будет обрезать изображение. Это означает, что если я загружу изображение 200×100, я получу изображение 100×50, уменьшенное, чтобы вписаться в указанные размеры. Если для урожая установлено значение true, я бы получил изображение 100×100 с верхним и нижним обрезанным.

Если вы каким-то образом загружаете изображения и сохраняете их URL-адреса, это неправильный способ сделать что-то, и вы должны задать вопрос об этом. Я бы порекомендовал:

«Когда я загружаю файл изображения, я сохраняю его URL. Как мне обрабатывать это как идентификатор сообщения вложений?»

Что касается wp_get_image_editor

Ваш код проверяет, возвратили ли функции ошибку, но затем не пытается обработать этот сценарий

Например:

 $editor = wp_get_image_editor( $avatar_full_path ); if ( ! is_wp_error( $editor ) ) { ... } 

Что произойдет, если is_wp_error true ? Ничего. Объектом $editor будет объект WP_Error, а не редактор изображений, и он будет содержать сообщение, сообщающее вам, что пошло не так, но поскольку вы не печатаете это сообщение, вы не знаете, что он говорит. Эти сообщения могут быть очень ясными о том, что пошло не так, например, указанный вами файл не существует или не может быть прочитан или файл не может быть сохранен

Если вы не хотите игнорировать исходный коэффициент изображения. Самый простой способ – использовать add_image_size() значение $ crop для false.

http://codex.wordpress.org/Function_Reference/add_image_size

Я нашел пример в документации WordPress.

http://codex.wordpress.org/Plugin_API/Filter_Reference/image_resize_dimensions

 add_filter( 'image_resize_dimensions', 'custom_image_resize_dimensions', 10, 6 ); function custom_image_resize_dimensions( $payload, $orig_w, $orig_h, $dest_w, $dest_h, $crop ){ // Change this to a conditional that decides whether you // want to override the defaults for this image or not. if( false ) return $payload; if ( $crop ) { // crop the largest possible portion of the original image that we can size to $dest_w x $dest_h $aspect_ratio = $orig_w / $orig_h; $new_w = min($dest_w, $orig_w); $new_h = min($dest_h, $orig_h); if ( !$new_w ) { $new_w = intval($new_h * $aspect_ratio); } if ( !$new_h ) { $new_h = intval($new_w / $aspect_ratio); } $size_ratio = max($new_w / $orig_w, $new_h / $orig_h); $crop_w = round($new_w / $size_ratio); $crop_h = round($new_h / $size_ratio); $s_x = floor( ($orig_w - $crop_w) / 2 ); $s_y = 0; // [[ formerly ]] ==> floor( ($orig_h - $crop_h) / 2 ); } else { // don't crop, just resize using $dest_w x $dest_h as a maximum bounding box $crop_w = $orig_w; $crop_h = $orig_h; $s_x = 0; $s_y = 0; list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h ); } // if the resulting image would be the same size or larger we don't want to resize it if ( $new_w >= $orig_w && $new_h >= $orig_h ) return false; // the return array matches the parameters to imagecopyresampled() // int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h ); } 

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

Увидев пример выше, вам, вероятно, придется изменить $new_w и $new_h . Этого уже достаточно, чтобы ввести hardcoded 100 для обоих. Здесь изменилась последняя строка.

 return array( 0, 0, (int) $s_x, (int) $s_y, 100, 100, (int) $crop_w, (int) $crop_h ); 

Надеюсь, это поможет.