如何使用 Google Apps 脚本自动化向图像添加水印或徽标?

问题描述 投票:0回答:1

我需要 Google Apps 脚本中的一个脚本来将两个图像合并为一个(向图像添加徽标或水印)。 我尝试过使用幻灯片 API 和文档 API,但遇到了问题。

尝试 #1:使用 Slides API

这是我写的脚本:

function addLogoToImage() {
  var imageBlob = UrlFetchApp.fetch("https://........jpg").getBlob();
  var logoBlob = UrlFetchApp.fetch("https://......jpg").getBlob();

  const presentation = SlidesApp.create('temp');
  const slide = presentation.getSlides()[0];

  // Add the main image
  slide.insertImage(imageBlob);

  // Add the logo
  slide.insertImage(logoBlob).setWidth(50).setHeight(50).setTop(10).setLeft(10);

  Utilities.sleep(2000);

  // Export the slide as an image
  const presentationId = presentation.getId();
  const exportUrl = `https://docs.google.com/presentation/d/${presentationId}/export/png`;

  const token = ScriptApp.getOAuthToken();
  const response = UrlFetchApp.fetch(exportUrl, {
    headers: {
      Authorization: `Bearer ${token}`,
    },
  });

  const thumbnail = response.getBlob().setName('merged_image.png');
  DriveApp.createFile(thumbnail);

  // Clean up by deleting the presentation
  Drive.Files.remove(presentationId);
}

但是,结果是一个 3 KB 大小的空白白色图像。

尝试#2:使用文档 API

我还尝试了使用以下脚本的文档 API:

function addLogoWithGoogleDrawings() {
  // Image URLs
  var imageUrl = "https://.........jpg";
  var logoUrl = "https://........jpg";

  // Add the images to a drawing
  var doc = DocumentApp.create("temp");
  var drawingId = doc.getId();
  var body = doc.getBody();
  body.appendImage(UrlFetchApp.fetch(imageUrl).getBlob());
  body.appendImage(UrlFetchApp.fetch(logoUrl).getBlob());

  // Wait for the content to load
  Utilities.sleep(3000);

  // Export as JPG
  const thumbnail = doc.getAs("image/png").setName('merged_image.png');
  DriveApp.createFile(thumbnail);

  // Clean up by deleting the document
  Drive.Files.remove(drawingId);
}

但是,根据文档,getAs() 方法仅支持导出到 application/pdf 或 text/markdown。

问题: 有谁知道如何使用 Google Apps 脚本合并图像并将它们导出为单个图像文件? 或者,有没有办法修复上面的脚本之一?

奖金...: 将来,我需要一个类似的解决方案来向视频添加水印(例如,在整个视频的一角显示徽标)。任何有关这方面的指导也将不胜感激!

谢谢!

google-apps-script
1个回答
0
投票

使用 Google Apps 脚本自动图像合并和下载

此脚本使用

Google Slides API
(通过 SlidesApp)自动创建 Google Slides 演示文稿。它通过首先获取
main image
logo or watermark
来合并两个图像。

然后,该脚本会创建一个新的 Google 幻灯片演示文稿,插入图像,并调整其大小和位置。

幻灯片将另存为 PNG 图像,存储在 Google 云端硬盘中,并且临时 Google 幻灯片演示文稿将被删除。

代码:

function downloadMergedSlide() {
  var pdfFile = mergeAndConvertToPng();

  var html = "<script>window.open('" + pdfFile.getDownloadUrl() + "');google.script.host.close();</script>";
  var userInterface = HtmlService.createHtmlOutput(html)
    .setHeight(10)
    .setWidth(100);

  SlidesApp.getUi().showModalDialog(userInterface, 'Downloading PDF ...');

  pdfFile.setTrashed(true);
}

function mergeAndConvertToPng() {
  const mainImageURL = "https://........jpg";
  const logoImageURL = "https://........jpg";

  const mainImageBlob = UrlFetchApp.fetch(mainImageURL).getBlob();
  const logoImageBlob = UrlFetchApp.fetch(logoImageURL).getBlob();

  const presentation = SlidesApp.create("Temp Merged Slide");
  const slide = presentation.getSlides()[0];

  const mainImage = slide.insertImage(mainImageBlob);
  mainImage.setWidth(960).setHeight(540).setTop(0).setLeft(0);

  const logoImage = slide.insertImage(logoImageBlob);
  logoImage.setWidth(50).setHeight(50).setTop(10).setLeft(10);

  presentation.saveAndClose();

  const presentationId = presentation.getId();
  const exportUrl = `https://docs.google.com/presentation/d/${presentationId}/export/png`;
  const token = ScriptApp.getOAuthToken();

  const response = UrlFetchApp.fetch(exportUrl, {
    headers: {
      Authorization: `Bearer ${token}`,
    },
    muteHttpExceptions: true,
  });

  if (response.getResponseCode() === 200) {
    const pdfBlob = response.getBlob();
    const pdfFile = DriveApp.createFile(pdfBlob.setName("merged_image.png"));

   
    DriveApp.getFileById(presentationId).setTrashed(true);

    return pdfFile;

  }

  return null;
}

示例输出:

Sample

要调整图像的大小或位置,您可以更改两个图像的

setWidth()
setHeight()
setTop()
setLeft()
的值。

参考:

插入图片

通过id获取文件

创建HtmlOutput(blob)

© www.soinside.com 2019 - 2024. All rights reserved.