我需要 Google Apps 脚本中的一个脚本来将两个图像合并为一个(向图像添加徽标或水印)。 我尝试过使用幻灯片 API 和文档 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 大小的空白白色图像。
我还尝试了使用以下脚本的文档 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 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;
}
示例输出:
要调整图像的大小或位置,您可以更改两个图像的
setWidth()
、setHeight()
、setTop()
和 setLeft()
的值。
参考: