Можно ли обрезать изображение с помощью скрипта приложения Google без использования стороннего API

Я хочу обрезать изображение с помощью Google App Script, если изображение находится вне рамки страницы, но, насколько я проверил в документации Google App Script, я не смог найти способ обрезать изображение. pageElements.asImage().replace (imgBlob, true); нельзя передавать размеры обрезки в качестве параметров в .replace() для обрезки изображения.

Я знаю, что этого можно достичь с помощью специального API, передавшего изображение и область кадрирования, которая вызовет метод обрезки на другом сервере.

А вот как можно будет работать с Google App Script, ищу совета специалиста.

введите описание изображения здесь


person Puzzled Boy    schedule 04.08.2020    source источник
comment
Вам понадобится библиотека парсера изображений, преобразованная в газ. Связанный: stackoverflow.com/q/63219204   -  person TheMaster    schedule 04.08.2020
comment
Пожалуйста, как разработчик, добавьте краткое описание ваших усилий по поиску / исследованию, как это предлагается в Как задать вопрос.   -  person Rubén    schedule 04.08.2020


Ответы (1)


Как насчет этого ответа?

Проблема:

Я думаю, что на данном этапе у replace(blobSource, crop) есть ограничение. В официальном документе говорится следующее.

crop Boolean: если true, изображение обрезается по размеру существующего. В противном случае изображение масштабируется и центрируется.

Я подтвердил, что когда изображение обрезается с помощью replace(blobSource, crop), центр изображения остается. Похоже, это текущая спецификация. И хотя в Slides API естьropProperties UpdateImagePropertiesRequest, к сожалению, на текущем этапе его нельзя использовать. Об этом уже сообщалось. Ссылка

Пример сценария:

Если вы используете replace(blobSource, crop) в соответствии с текущей спецификацией, как насчет следующего примера сценария? В качестве примера ситуации на 1-м слайде подготавливаются 2 изображения image1 и image2, а image1 кадрируется с использованием image2.

Последовательность этого скрипта выглядит следующим образом.

Поток:

  1. Получите 2 изображения из слайда в Google Slides.
  2. Обрежьте image1, используя image2. Таким образом, изображение2 заменяется на изображение1.
  3. Переместите обрезанное изображение на image1.
  4. Удалить исходное изображение 1.

Сценарий:

function myFunction() {
  // 1. Retrieve 2 images from a slide on Google Slides.
  var slide = SlidesApp.getActivePresentation().getSlides()[0];
  var images = slide.getImages();
  var image1 = images[0];  // Red image.
  var image2 = images[1];  // Blue image.
  
  // 2. Crop "image1" using "image2". By this, "image2" is replaced with "image1".
  var replacedImage = image2.replace(image1.getBlob(), true);
  
  // 3. Move the cropped image to "image1".
  replacedImage.setTop(image1.getTop()).setLeft(image1.getLeft());
  
  // 4. Remove the original "image1".
  image1.remove();
}

Результат:

При запуске скрипта изображение image1 обрезается. Но обнаружено, что на текущем этапе центр image1 остается за кадром.

введите описание изображения здесь

Примечание:

  • Slides API и Slides Service сейчас растут. Так что я думаю, что эта ситуация может быть изменена в будущем обновлении. Но если вы хотите этого в ближайшее время, как насчет того, чтобы запросить это в системе отслеживания проблем в качестве будущего запроса? Ссылка

Использованная литература:

Добавлен:

В дополнительном примере сценария для использования replace(blobSource, crop) я хотел бы предложить метод использования собственного образа. В этом примере сценария, когда изображение выступает, изображение вне страницы удаляется путем обрезки. Основной метод такой же, как и в приведенном выше примере сценария.

Пример сценария:

function myFunction() {
  var s = SlidesApp.getActivePresentation();
  var slide = s.getSlides()[0];
  var images = slide.getImages();
  var image = images[0];
  var pageWidth = s.getPageWidth();
  var imagePosition = image.getLeft();
  var imageWidth = image.getWidth();
  var check = imagePosition + imageWidth - pageWidth;
  if (check > 0 && check < imageWidth) {
    image
      .duplicate()
      .setWidth(pageWidth - imagePosition)
      .asImage()
      .replace(image.getBlob(), true);
    image.remove();
  }
}

Результат:

введите описание изображения здесь

Примечание:

  • В этом примере сценария я подготовил только правую часть горизонтального направления. Поэтому, если вы хотите удалить вертикальное направление, пожалуйста, измените сценарий для вашей реальной ситуации.
person Tanaike    schedule 04.08.2020
comment
Я ценю ваше решение, но для меня это не сработает. но я узнаю из вашего решения. Спасибо. - person Puzzled Boy; 06.08.2020
comment
@Puzzled Boy Спасибо за ответ. Я должен извиниться за плохое знание английского языка. К сожалению, от but this will not work for me. я не могу понять вашу ситуацию. Могу я спросить вас о деталях вашего текущего вопроса? Если вы можете сотрудничать, чтобы решить вашу проблему, я буду рад. - person Tanaike; 06.08.2020
comment
Спасибо, но у меня может работать новое решение, которое вы добавили. - person Puzzled Boy; 06.08.2020
comment
i.stack.imgur.com/nmtBC.png как насчет обрезки области, которая выходя за пределы страницы. должна быть видна только область изображения, которая находится внутри страницы. - person Puzzled Boy; 06.08.2020
comment
@Puzzled Boy Спасибо за ответ. К сожалению, я не могу понять only the image area which is inside the page should visiblw. Это связано с моим плохим знанием английского языка. Я глубоко извиняюсь за это. Итак, чтобы правильно понять вашу ситуацию, можете ли вы предоставить образцы входных и выходных данных, которые вы ожидаете? Таким образом, я хотел бы попытаться понять вашу ситуацию и подумать о решении. Если вы можете сотрудничать, чтобы решить вашу проблему, я буду рад. - person Tanaike; 06.08.2020
comment
Ваш английский неплохой, технический говорит хорошо. Я поделюсь образцом в следующие несколько минут .. - person Puzzled Boy; 06.08.2020
comment
@Puzzled Boy Кстати, в дополнительном скрипте изображение вне страницы убирается обрезкой. Вы можете увидеть примерную ситуацию на изображении выше. Разве результат вам не нужен? Меня беспокоит, правильно ли я понял вашу цель. - person Tanaike; 06.08.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person Puzzled Boy; 06.08.2020