【GAS】画像をリサイズする(ImgAppライブラリ)
Google Apps Script(GAS)を使って、Googleドライブにアップロードされている画像をリサイズする方法をご紹介します。
画像をリサイズしたいとき、PCにプレインストールされているアプリなどでトリミングや容量変更することはできても任意の大きさでリサイズすることは難しく、画像編集ソフトを持っているデザイナー等に依頼することも多いと思います。GASを使えば、自分のGoogleドライブ上で完結するため人に依頼する手間も削減され、スクリプトを一度作成してしまえば自由に編集できるようになります。
この記事では、画像リサイズのベーシックな記述方法と実際の手順、ImgAppライブラリの他のメソッドの使い方をご紹介します。
GASで画像リサイズする手順
GASで画像ファイルをリサイズする手順は下記のとおりです。
GASはPCのローカル領域にはアクセスできないため、まずはGoogleドライブ上にリサイズ対象の画像ファイルをアップロードする必要があります。
また、GASの標準機能では画像リサイズができないため、GASに『ImgApp』というライブラリというインストールします。最後に、IDやフォルダで指定してアップロードした画像ファイルのリサイズを行います。
それでは一つずつ見ていきましょう。
Googleドライブに画像ファイルをアップロード
まずは自分のGoogleドライブ(Google Workspace)上に画像ファイルをアップロードします。ID指定をすればドライブ上どこにあっても問題ありませんが、変換後のファイルを近いフォルダに格納したり、複数ファイル対象として変換したい場合などを想定すると一つのフォルダにまとまっていた方が後々楽でしょう。
GASエディタを開いてImgAppライブラリのインストール
ドライブ上で「新規」>「Googleスプレッドシート」>「拡張機能」>「Apps Script」でエディタを開きます。
エディタを開けたら、左のメニュー「ライブラリ」横の『+』をクリックします。
ライブラリのIDを記載できるポッポアップが表示されるので、『ImgApp』のIDを入力してください。2022年8月現在のIDは下記になります。
1T03nYHRho6XMWYcaumClcWr6ble65mAT8OLJqRFJ5lukPVogAN2NDl-y
「検索」ボタンをクリックして「ImgApp」が表示されればそのまま「追加」ボタンをクリックしてインストール完了です。
アップデート等でバージョンが異なったりするとエラーになることがあるので、新しいIDを調べてインストールするようにしてください。
ライブラリは以下より確認できます。
https://github.com/tanaikech/ImgApp
ファイルID・フォルダIDの取得
スクリプトの記述で必要になるので、リサイズしたい画像ファイルのファイルIDと格納先のフォルダIDを取得しておきます。
ファイルIDの取得
一番簡単なやり方は「リンクを取得」で得られる共有用のURLからファイルIDを抽出する方法でしょう。「https://drive.google.com/file/d/{ファイルID}/view?usp=sharing」の{ファイルID}部分を補完しておいてください。
わざわざドライブまで見に行くのが面倒だったり、一つのファイルではなく複数ファイルを対象にしたい場合はGAS記述で取得することも可能です。詳しくは下記の記事をご覧ください。
フォルダIDの取得
ファイルIDと同様にURLにIDが記載されているのでここをコピーするのが一番手っ取り早いでしょう。今回は元データと同じフォルダに格納することにします。
他の方法は下記の記事でも解説しています。
GASの画像リサイズサンプルコード
// //ファイルIDを指定して画像ファイルの取得
let fileId = "[ファイルID]";
//doResizeメソッド実行
//リサイズ後の横幅を200pxと指定してblob型オブジェクトを取得
res = ImgApp.doResize(fileId, 200);
//console.log(res);
//格納先のフォルダIDを指定してリサイズ後のファイルを保存
let folder = DriveApp.getFolderById("[フォルダID]");
folder.createFile(res.blob.setName("resized_image"));
無事リサイズを実行することができました。
ImgAppライブラリのメソッド紹介
サンプルコードではdoResizeメソッドのみを使いましたが、他メソッド含めImgAppライブラリで活用できるメソッドをご紹介します。
getSizeメソッド
ImgApp.getSize(blob)
getSizeメソッドはファイル情報を取得するメソッドです。画像ファイルのBlob型オブジェクトをパラメータとして事項すると、画像の大きさサイズ(縦/横)の他、ファイル形式、容量をJSONオブジェクトで返してくれます。
Blob型(バイナリ・ラージ・オブジェクト型)のオブジェクトのこと。ファイル名とMIME型で定義されるデータ型で、音声、動画、圧縮ファイル、実行ファイルなどのファイル情報やタイプ変換の際に使われます。ImgAppクラスではこのBlob型のオブジェクトをパラメータとして処理を行います。
//ファイルIDを指定して画像ファイルの取得
let fileId = "[ファイルID]";
let file = DriveApp.getFileById(fileId);
let blob = file.getBlob();
//getSizeメソッド実行
let res = ImgApp.getSize(blob);
console.log(res);
{ identification: 'PNG’,
width: 380,
height: 400,
filesize: 148942 }
ちなみにですが、JSONオブジェクトが返ってくるので各要素は下記のように表現可能です。
console.log("width: " + width);
console.log("height: " + height);
width: 380
height: 400
doResizeメソッド
ImgApp.doResize(fileId, width)
- fileId (string) : 変換したい画像ファイルのファイルID
- width (integer) : リサイズ後の横幅
画像のリサイズを実行するためのメソッドです。横幅しか指定していないところからわかるようにアスペクト比を変えることはできません。
下記のサンプルコードではfile IDはgetSizeメソッドと同じものを使っています。
// 横幅が2oo pxとなるようにリサイズしたblob型オブジェクト
res = ImgApp.doResize(fileId, 200);
//console.log(res);
let folder = DriveApp.getFolderById("[フォルダID]");
folder.createFile(res.blob.setName("resized_image"));
レスポンスはリサイズ後の画像のblob型オブジェクトになるので、格納先のフォルダを指定して保存します。
editImageメソッド
ImgApp.editImage(object)
- object(object):トリミング使用を指定するパラメータオブジェクト ※記述方法は下記サンプル参照
画像のトリミングができるメソッドです。変換後の画像のblob型オブジェクトを返します。
let imageBlob = file.getBlob();
const object = {
blob: imageBlob,
unit: "pixel",
crop: { t: 50, b: 50, l: 50, r: 50 }, //t:top, b:bottom, l:left and r:right
outputWidth: 400,
};
//editImageメソッドの実行
let res = ImgApp.editImage(object);
//格納先のフォルダIDを指定してトリミング後のファイルを保存
let folder = DriveApp.getFolderById("[フォルダID]");
folder.createFile(res.blob.setName("edited_image"));
- blob (Blob) : トリミング対象とする画像のblob型オブジェクト
- unit (String) : “pixel"または"point"で単位を指定
- crop (Object) : トリミングの長さ。t→top、b→bottom、l→left、r→rightを表しており、指定単位で記述
- outputWidth (Integer) : アウトプットサイズの横幅
updateThumnailメソッド
ImgApp.updateThumbnail(imgFileId, srcFileId)
- imgFileId (string) : サムネイルとして使用したい画像のファイルID
- srcFileId (integer) : サムネイルを変換したいファイルのID
updateThumnailメソッドは、Googleドライブ上のファイルのサムネイルを任意の画像に差し替えるメソッドです。例えばzipファイルはサムネイルを持っておらず、デフォルトでは下記のような表示になっています。
このようなファイルについても指定した任意の画像ファイルをサムネイルとして挿入することが可能です。
// updateThumbnailメソッドの実行
ImgApp.updateThumbnail("[画像ファイルID]", "[updateThumbnail_1.zipのファイルID]");
ImgApp.updateThumbnail("[画像ファイルID]", "[updateThumbnail_2.zipのファイルID]");
ImgApp.updateThumbnail("[画像ファイルID]", "[updateThumbnail_3.zipのファイルID]");
ImgApp.updateThumbnail("[画像ファイルID]", "[updateThumbnail_4.zipのファイルID]");
注:実行1回目は失敗します
2022年8月現在の環境では、updateThumnailメソッドを実行しても1回目は失敗し、2回目でサムネイル画像のアップデートに成功するようです。ライブラリ作者も同様の注意喚起をしており原因は不明とのことなので何かしらのバグなのでしょう。
In my environment, at the first update, the update had sometimes been failed. But at that time, the second update had worked fine. I don’t know about the reason. I’m sorry.
https://github.com/tanaikech/ImgApp#updatethumbnail
ImgAppライブラリはPDFには使えない
ImpAppは画像ファイルを対象としているため、処理できるファイル形式処理できるファイル形式は「png」「jpg」「gif」「bmp」に限られています。それ以外の形式のファイル(例えばPDF等)に処理を実行しようとすると下記のようなエラーが返ってきます。
{ Error: 'Cannot retrieve image size. Now, it can retrive image size from png, jpg, gif and bmp.’ }
まとめ
Google Apps Script(GAS)を使って画像リサイズするための手順、ImgAppライブラリの他のメソッドの使い方をご紹介しました。
画像処理の関連記事もぜひご覧ください。