如何使用 Google Apps 脚本更改图像的像素质量和大小?
How to change the pixel quality and size of Image using Google Apps Script?
我有一个图像 URL 列表,我想获取所有大小超过 14Mb 或质量超过 14 兆像素的图像,并将它们的大小调整为小于 5Mb 和质量为 10 兆像素。我使用了@Tanaike 在 Github 上提供的 Image library 来操纵图像大小和质量。
这是将图像下载为 blob 并使用 ImgApp
库检查其大小和维度的代码片段:
funtion CompressImage() {
var url = "http://images.salsify.com/image/upload/s--PyaEswlb
--/f595bd4e42783097f42e4615e17024b6b82da014.jpg";
var folderId = "Your Folder ID";
var folder = DriveApp.getFolderById(folderId);
var response = UrlFetchApp.fetch(url)
var fileBlob = response.getBlob()
var res = ImgApp.getSize(fileBlob);
if((res.filesize/1000000)>14 || res.width>14000000)
{
ProcessImage(fileBlob , folder);
}
}
上面代码中的 If 语句检查文件大小和像素质量,如果超过阈值(14Mb 大小,14 兆像素质量),则执行 ProcessImage
函数。此函数设置宽度大小,并用新调整大小的图像替换旧图像。
function ProcessImage(fileBlob,folder)
{
var width = 3600; // Please set the size of width with the unit of pixels.
var file = folder.createFile(fileBlob);
var fileId = file.getId();
var link = Drive.Files.get(fileId).thumbnailLink.replace(/\=s.+/, "=s" + width);
var blob2 = UrlFetchApp.fetch(link).getBlob().setName("Compressed Image");
var file = folder.createFile(blob2);
var img = Drive.Files.get(file.getId()).webContentLink; //get the view link of image downloaded in drive
Logger.log(img);
Drive.Files.remove(fileId);
}
以上两个函数结合起来得到大小小于 14 Mb 的调整大小的图像,但我无法更改图像的像素质量(小于 14 兆像素)。你能指导我做错了什么吗?任何帮助将非常感激。谢谢。
我相信你的目标如下。
- 您想将图片尺寸从 4480x4480 缩小到 2000x2000。这时候你就想把低质量的图片降低。
- 您想使用 Google Apps 脚本实现此目的。
问题和解决方法:
我认为在这种情况下,例如,当你想将图像尺寸从 4480x4480 缩小到 2000x2000 时,以下流程可以实现你的目标。
- 将图片从 4480x4480 缩小到 100x100。
- 将图片从 100x100 增加到 2000x2000。
通过这种方式,可以通过保持尺寸来降低图像质量。但是,不幸的是,使用 thumbnailLink
的方法无法增加图像。为此,需要使用另一种解决方法。
在此回答中,我想提出另一种更改图像大小的解决方法。
用法
1。安装 Google Apps 脚本库。
作为另一个 Google Apps 脚本库,请安装 DocsServiceApp. You can see how to install it at here。
2。示例脚本。
使用你的脚本时,修改后的脚本如下。在这种情况下,我修改了你的函数 ProcessImage
.
// Please run this function.
function CompressImage() {
var url = "http://images.salsify.com/image/upload/s--54TepGAl--/2f76d5ec5400b654b6f3dbd068db7898a76389cf.jpg";
var folderId = "root";
var folder = DriveApp.getFolderById(folderId);
var response = UrlFetchApp.fetch(url)
var fileBlob = response.getBlob()
var res = ImgApp.getSize(fileBlob);
if ((res.filesize / 1000000) > 14 || res.width > 14000000) {
ProcessImage(fileBlob, folder);
}
}
function ProcessImage(fileBlob, folder) {
var width1 = 100; // Please adjust this value.
var width2 = 2000; // Please adjust this value.
// Create original image as a file.
var file1 = folder.createFile(fileBlob);
var fileId1 = file1.getId();
// Reduce original image size.
var link1 = Drive.Files.get(fileId1).thumbnailLink.replace(/\=s.+/, "=s" + width1);
// Increase converted image size.
const object = { title: "temp", parent: "root", width: { unit: "pixel", size: width2 }, height: { unit: "pixel", size: width2 } };
const sId = DocsServiceApp.createNewSlidesWithPageSize(object);
const s = SlidesApp.openById(sId);
const slide = s.getSlides()[0];
slide.insertImage(link1).setWidth(width2 / 1.33333).setHeight(width2 / 1.33333);
s.saveAndClose();
// Retrieve result image.
const link2 = Slides.Presentations.Pages.getThumbnail(sId, slide.getObjectId(), { "thumbnailProperties.thumbnailSize": "LARGE" }).contentUrl;
var blob2 = UrlFetchApp.fetch(link2).getBlob().setName("Compressed Image");
var file2 = folder.createFile(blob2);
var img = Drive.Files.get(file2.getId()).webContentLink;
Logger.log(img);
Drive.Files.remove(fileId1);
Drive.Files.remove(sId);
}
重要提示:在此解决方法中,重要的一点是,根据幻灯片的当前规格 API,可以选择输出图像大小只有 3 种模式,例如 LARGE
(缩略图宽度为 1600px。),MEDIUM
(缩略图宽度为 800px。),SMALL
(缩略图宽度为 200px。)。我认为这是此解决方法的瓶颈。
当此脚本为运行时,使用thumbnailLink
将原始图像的图像尺寸从4480x4480转换为100x100。并且,使用 DocsServiceApp 和 Google 幻灯片将 100x100 的图像转换为 2000x2000。并且,当从 Google Slides 导出图像时,会获得一张 1600x1600 的低质量图像。
注:
100x100
和 2000x2000
是样本大小。所以,请根据您的实际情况修改var width1 = 100;
和var width2 = 2000;
的值。通过这个,你可以控制图像的质量。
参考:
我有一个图像 URL 列表,我想获取所有大小超过 14Mb 或质量超过 14 兆像素的图像,并将它们的大小调整为小于 5Mb 和质量为 10 兆像素。我使用了@Tanaike 在 Github 上提供的 Image library 来操纵图像大小和质量。
这是将图像下载为 blob 并使用 ImgApp
库检查其大小和维度的代码片段:
funtion CompressImage() {
var url = "http://images.salsify.com/image/upload/s--PyaEswlb
--/f595bd4e42783097f42e4615e17024b6b82da014.jpg";
var folderId = "Your Folder ID";
var folder = DriveApp.getFolderById(folderId);
var response = UrlFetchApp.fetch(url)
var fileBlob = response.getBlob()
var res = ImgApp.getSize(fileBlob);
if((res.filesize/1000000)>14 || res.width>14000000)
{
ProcessImage(fileBlob , folder);
}
}
上面代码中的 If 语句检查文件大小和像素质量,如果超过阈值(14Mb 大小,14 兆像素质量),则执行 ProcessImage
函数。此函数设置宽度大小,并用新调整大小的图像替换旧图像。
function ProcessImage(fileBlob,folder)
{
var width = 3600; // Please set the size of width with the unit of pixels.
var file = folder.createFile(fileBlob);
var fileId = file.getId();
var link = Drive.Files.get(fileId).thumbnailLink.replace(/\=s.+/, "=s" + width);
var blob2 = UrlFetchApp.fetch(link).getBlob().setName("Compressed Image");
var file = folder.createFile(blob2);
var img = Drive.Files.get(file.getId()).webContentLink; //get the view link of image downloaded in drive
Logger.log(img);
Drive.Files.remove(fileId);
}
以上两个函数结合起来得到大小小于 14 Mb 的调整大小的图像,但我无法更改图像的像素质量(小于 14 兆像素)。你能指导我做错了什么吗?任何帮助将非常感激。谢谢。
我相信你的目标如下。
- 您想将图片尺寸从 4480x4480 缩小到 2000x2000。这时候你就想把低质量的图片降低。
- 您想使用 Google Apps 脚本实现此目的。
问题和解决方法:
我认为在这种情况下,例如,当你想将图像尺寸从 4480x4480 缩小到 2000x2000 时,以下流程可以实现你的目标。
- 将图片从 4480x4480 缩小到 100x100。
- 将图片从 100x100 增加到 2000x2000。
通过这种方式,可以通过保持尺寸来降低图像质量。但是,不幸的是,使用 thumbnailLink
的方法无法增加图像。为此,需要使用另一种解决方法。
在此回答中,我想提出另一种更改图像大小的解决方法。
用法
1。安装 Google Apps 脚本库。
作为另一个 Google Apps 脚本库,请安装 DocsServiceApp. You can see how to install it at here。
2。示例脚本。
使用你的脚本时,修改后的脚本如下。在这种情况下,我修改了你的函数 ProcessImage
.
// Please run this function.
function CompressImage() {
var url = "http://images.salsify.com/image/upload/s--54TepGAl--/2f76d5ec5400b654b6f3dbd068db7898a76389cf.jpg";
var folderId = "root";
var folder = DriveApp.getFolderById(folderId);
var response = UrlFetchApp.fetch(url)
var fileBlob = response.getBlob()
var res = ImgApp.getSize(fileBlob);
if ((res.filesize / 1000000) > 14 || res.width > 14000000) {
ProcessImage(fileBlob, folder);
}
}
function ProcessImage(fileBlob, folder) {
var width1 = 100; // Please adjust this value.
var width2 = 2000; // Please adjust this value.
// Create original image as a file.
var file1 = folder.createFile(fileBlob);
var fileId1 = file1.getId();
// Reduce original image size.
var link1 = Drive.Files.get(fileId1).thumbnailLink.replace(/\=s.+/, "=s" + width1);
// Increase converted image size.
const object = { title: "temp", parent: "root", width: { unit: "pixel", size: width2 }, height: { unit: "pixel", size: width2 } };
const sId = DocsServiceApp.createNewSlidesWithPageSize(object);
const s = SlidesApp.openById(sId);
const slide = s.getSlides()[0];
slide.insertImage(link1).setWidth(width2 / 1.33333).setHeight(width2 / 1.33333);
s.saveAndClose();
// Retrieve result image.
const link2 = Slides.Presentations.Pages.getThumbnail(sId, slide.getObjectId(), { "thumbnailProperties.thumbnailSize": "LARGE" }).contentUrl;
var blob2 = UrlFetchApp.fetch(link2).getBlob().setName("Compressed Image");
var file2 = folder.createFile(blob2);
var img = Drive.Files.get(file2.getId()).webContentLink;
Logger.log(img);
Drive.Files.remove(fileId1);
Drive.Files.remove(sId);
}
重要提示:在此解决方法中,重要的一点是,根据幻灯片的当前规格 API,可以选择输出图像大小只有 3 种模式,例如
LARGE
(缩略图宽度为 1600px。),MEDIUM
(缩略图宽度为 800px。),SMALL
(缩略图宽度为 200px。)。我认为这是此解决方法的瓶颈。当此脚本为运行时,使用
thumbnailLink
将原始图像的图像尺寸从4480x4480转换为100x100。并且,使用 DocsServiceApp 和 Google 幻灯片将 100x100 的图像转换为 2000x2000。并且,当从 Google Slides 导出图像时,会获得一张 1600x1600 的低质量图像。
注:
100x100
和2000x2000
是样本大小。所以,请根据您的实际情况修改var width1 = 100;
和var width2 = 2000;
的值。通过这个,你可以控制图像的质量。