You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Google Apps Script为图片添加水印/Logo?求可行方案或脚本修复

Google Apps Script 图片合并(添加Logo/水印)及视频水印方案

修复Slides API实现图片合并的脚本

你之前用Slides API生成空白图,大概率是因为幻灯片尺寸未匹配主图、导出时未等待内容同步,或者导出参数不正确。以下是修复后的完整脚本:

function mergeImagesWithSlidesAPI() {
  // 替换为你的主图和Logo的Google Drive文件ID
  const mainImageId = "【主图文件ID】";
  const logoImageId = "【Logo文件ID】";
  
  // 获取图片Blob
  const mainImageBlob = DriveApp.getFileById(mainImageId).getBlob();
  const logoBlob = DriveApp.getFileById(logoImageId).getBlob();
  
  // 获取主图原始尺寸(确保幻灯片匹配)
  const imageMetadata = JSON.parse(UrlFetchApp.fetch(
    `https://www.googleapis.com/drive/v3/files/${mainImageId}?fields=imageMediaMetadata`,
    { headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` } }
  ).getContentText());
  const { width, height } = imageMetadata.imageMediaMetadata;
  
  // 创建临时演示文稿并设置尺寸
  const presentation = SlidesApp.create("临时合并幻灯片");
  const slide = presentation.getSlides()[0];
  presentation.setPageWidth(width);
  presentation.setPageHeight(height);
  
  // 插入主图并铺满幻灯片
  slide.insertImage(mainImageBlob)
    .setLeft(0)
    .setTop(0)
    .setWidth(width)
    .setHeight(height);
  
  // 插入Logo到右下角(可调整尺寸和边距)
  const logoWidth = 100; // 自定义Logo宽度
  const logo = slide.insertImage(logoBlob).setWidth(logoWidth);
  logo.setLeft(width - logoWidth - 20) // 右边距20px
       .setTop(height - logo.getHeight() - 20); // 下边距20px
  
  // 保存并等待同步(关键步骤,避免导出空白)
  presentation.saveAndClose();
  Utilities.sleep(2000); // 等待2秒确保内容同步到服务器
  
  // 调用Slides API导出幻灯片为图片
  const exportUrl = `https://slides.googleapis.com/v1/presentations/${presentation.getId()}/pages/1/thumbnail?mimeType=image/png&thumbnailProperties.thumbnailSize=LARGE`;
  const response = UrlFetchApp.fetch(exportUrl, {
    headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` }
  });
  const mergedBlob = response.getBlob().setName("合并后的图片_Slides.png");
  
  // 保存结果到Drive并清理临时文件
  DriveApp.createFile(mergedBlob);
  DriveApp.getFileById(presentation.getId()).setTrashed(true);
}

使用说明

  1. 启用Slides API:在脚本编辑器中,依次点击「扩展」→「Apps Script API」,搜索并启用Google Slides API。
  2. 替换代码中的【主图文件ID】和【Logo文件ID】为你Drive中对应文件的ID。
  3. 执行脚本时会请求相关权限,授权后即可生成合并后的图片。

用HTML服务+Canvas实现图片合并(无需高级API)

如果不想启用Slides API,可利用浏览器Canvas的绘图能力实现合并,方案更轻量化:

function mergeImagesWithCanvas() {
  const mainImageId = "【主图文件ID】";
  const logoImageId = "【Logo文件ID】";
  
  // 获取图片的可访问链接
  const mainImageUrl = DriveApp.getFileById(mainImageId).getDownloadUrl();
  const logoUrl = DriveApp.getFileById(logoImageId).getDownloadUrl();
  
  // 创建HTML模板,通过Canvas完成图片合并
  const htmlTemplate = HtmlService.createHtmlOutput(`
    <canvas id="mergeCanvas" style="display:none;"></canvas>
    <script>
      async function mergeImages() {
        const mainImg = new Image();
        const logoImg = new Image();
        
        // 等待两张图片加载完成
        await Promise.all([
          new Promise(resolve => { mainImg.onload = resolve; mainImg.src = "${mainImageUrl}"; }),
          new Promise(resolve => { logoImg.onload = resolve; logoImg.src = "${logoUrl}"; })
        ]);
        
        // 设置Canvas尺寸匹配主图
        const canvas = document.getElementById('mergeCanvas');
        canvas.width = mainImg.width;
        canvas.height = mainImg.height;
        const ctx = canvas.getContext('2d');
        
        // 绘制主图
        ctx.drawImage(mainImg, 0, 0);
        
        // 绘制Logo到右下角(调整尺寸和边距)
        const logoWidth = 100;
        const logoHeight = logoImg.height * (logoWidth / logoImg.width);
        ctx.drawImage(logoImg, 
          mainImg.width - logoWidth - 20, 
          mainImg.height - logoHeight - 20, 
          logoWidth, logoHeight
        );
        
        // 将合并结果发送回脚本保存
        canvas.toBlob(blob => {
          google.script.run.saveMergedImage(blob);
        }, 'image/png');
      }
      mergeImages();
    </script>
  `);
  
  // 弹出对话框执行合并
  SpreadsheetApp.getUi().showModalDialog(htmlTemplate, "图片合并中...");
}

// 保存合并后的图片到Drive
function saveMergedImage(blob) {
  DriveApp.createFile(blob.setName("合并后的图片_Canvas.png"));
  SpreadsheetApp.getUi().alert("合并完成!图片已保存到你的Google Drive。");
}

使用说明

直接执行mergeImagesWithCanvas函数,授权后会弹出对话框自动完成合并,结果直接保存到Drive。


视频添加水印的实现指引

Google Apps Script本身不具备视频编码处理能力,需结合外部服务实现,推荐两种方案:

方案1:Google Cloud Run + FFmpeg(自定义水印)

  1. 部署FFmpeg服务:在Google Cloud平台创建Cloud Run服务,封装FFmpeg命令(如ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-20:H-h-20" output.mp4,实现右下角水印)。
  2. GAS触发处理:在脚本中上传目标视频和Logo到Cloud Storage,调用Cloud Run的API触发水印处理,处理完成后将结果下载回Google Drive。

方案2:YouTube Data API(频道级统一水印)

如果视频最终上传到YouTube,可通过YouTube Data API设置频道水印(适用于所有视频统一添加相同水印),但无法单独为单个视频设置自定义水印。

注:视频处理涉及大量计算资源,必须依赖云平台服务,GAS仅作为触发和调度的入口。

内容的提问来源于stack exchange,提问作者הלוי הלוי

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:09:52