我有一個影像 URL 串列,我想獲取所有大小超過 14Mb 或質量超過 14 兆像素的影像,并將它們的大小調整為低于 5Mb 和質量 10 兆像素。我在 Github 上使用 @Tanaike 提供的影像庫來控制影像大小和質量。
這是將影像下載為 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 兆像素)。你能指導我做錯了什么嗎?任何幫助將非常感激。謝謝你。
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想將影像尺寸從 4480x4480 減小到 2000x2000。此時,您要降低影像質量較低。
- 您想使用 Google Apps 腳本實作此目的。
問題和解決方法:
我認為在這種情況下,例如,當您想將影像尺寸從 4480x4480 減小到 2000x2000 時,以下流程可以實作您的目標。
- 將影像從 4480x4480 縮小到 100x100。
- 將影像從 100x100 增加到 2000x2000。
這樣,可以通過保持尺寸來降低影像質量。但是,不幸的是,使用的方法thumbnailLink不能增加影像。因此,需要使用另一種解決方法。
在這個答案中,我想提出另一種更改影像大小的解決方法。
用法
1. 安裝 Google Apps 腳本庫。
作為另一個 Google Apps 腳本庫,請安裝DocsServiceApp。您可以在此處查看如何安裝它。
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);
}
重要提示:在此解決方法中,作為重點,根據 Slides API 的當前規范,輸出影像大小只能選擇 3 種模式,如
LARGE(縮略圖寬度為 1600 像素。),MEDIUM(縮略圖影像寬度為 800 像素。),SMALL(縮略圖影像寬度為 200 像素。)。我認為這是此解決方法的瓶頸。運行此腳本時,使用
thumbnailLink. 并且,使用 DocsServiceApp 和 Google Slides 將 100x100 的影像轉換為 2000x2000。并且,當從 Google 幻燈片匯出影像時,會獲得 1600x1600 的低質量影像。
筆記:
100x100并且2000x2000是樣本大小。因此,請根據您的實際情況修改var width1 = 100;和的值。var width2 = 2000;這樣,您可以控制影像的質量。
參考:
- DocsServiceApp
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473288.html
