如何使用 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 时,以下流程可以实现你的目标。

  1. 将图片从 4480x4480 缩小到 100x100。
  2. 将图片从 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 的低质量图像。

注:

  • 100x1002000x2000 是样本大小。所以,请根据您的实际情况修改var width1 = 100;var width2 = 2000;的值。通过这个,你可以控制图像的质量。

参考: