如何用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); }
使用说明
- 启用Slides API:在脚本编辑器中,依次点击「扩展」→「Apps Script API」,搜索并启用Google Slides API。
- 替换代码中的
【主图文件ID】和【Logo文件ID】为你Drive中对应文件的ID。 - 执行脚本时会请求相关权限,授权后即可生成合并后的图片。
用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(自定义水印)
- 部署FFmpeg服务:在Google Cloud平台创建Cloud Run服务,封装FFmpeg命令(如
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-20:H-h-20" output.mp4,实现右下角水印)。 - GAS触发处理:在脚本中上传目标视频和Logo到Cloud Storage,调用Cloud Run的API触发水印处理,处理完成后将结果下载回Google Drive。
方案2:YouTube Data API(频道级统一水印)
如果视频最终上传到YouTube,可通过YouTube Data API设置频道水印(适用于所有视频统一添加相同水印),但无法单独为单个视频设置自定义水印。
注:视频处理涉及大量计算资源,必须依赖云平台服务,GAS仅作为触发和调度的入口。
内容的提问来源于stack exchange,提问作者הלוי הלוי
相关产品推荐
相关产品推荐

