見出し画像

aiファイルを「画像非表示」で軽くする

手元の検証では、32MBが0.3MBになりました。
PDF互換オフとの比較、非表示のコツ、画像の表示を切り替えるスクリプトを公開します。

この方法の使いどころ

ワークフローにもよりますが、私は次のような目的で使っています。
1. ファイルサイズを小さくする
 サーバの使用量を減らす、メール添付サイズの制限をクリアするなど
2. 保存にかかる時間を短くする
 軽くなって気軽に上書き保存でき、忙しい時の安心感に繋がります
3. プレビューできるようにしておく
 Illustratorで開かなくても、ある程度、中身や進捗が分かります

以下、ファイルサイズを中心に検証していきます。

検証1: リンク画像を「非表示」 → 軽くなる

画像をいくつか用意して、適当に並べます。すべてリンク配置です。

画像7

これを次の条件(組み合わせ)で4つのファイルにし、ファイルサイズを比較します。
・画像表示で2条件:表示あり/なし
・互換設定で2条件:PDF互換ファイルの作成あり/なし

画像8

ファイル1aに対して1cのサイズが小さくなりました。どちらもPDF互換ありで、プレビューが有効です。ファイルのアイコンも微妙に異なっているのが見えるでしょうか。

1b、1dもファイルサイズが小さくなっています。1cに比べればやや大きいですが、元のファイル1aに比べれば、どれも100分の1程度に小さくなっている点で違いはありません。それよりも顕著に異なるのは、1b、1dがプレビュー無効であることです。PDF互換なしで保存したことがその理由です。

画像7

つまり、画像を非表示にして保存するだけで、ある程度のプレビューを有効にしつつ、PDF互換オフ並みか、それ以上のファイルサイズ縮小効果が見込めるというわけです。

参考値として、画像そのものと、画像なしのファイルサイズを掲載します。「画像なし」とは、配置画像を削除したもので、ほぼ空っぽのファイルです(アートボード・背景矩形・レイヤー構造が残っています)。
比べてみると、ファイル1cのサイズ(327KB)は、空っぽのファイルに匹敵する小ささであることが分かります。

画像7

ここまで、リンク配置した画像を非表示にすることで、プレビュー有効のままで、ファイルサイズを小さくできることを確認しました。
次は、埋め込み画像の場合にどうなるかを確かめます。

検証2:埋め込み画像を「非表示」 → 軽くなる

画像を埋め込む方法には大きく2種類あるので、これを条件に加えて組み合わせ、8つのファイルサイズを比較します。
・画像表示で2条件:表示あり/なし
・互換設定で2条件:PDF互換ファイルの作成あり/なし
・埋込方法で2条件:編集時に埋め込み/保存時に埋め込み

画像7

画像8

結果を見ると、ファイルサイズが大小に二分化しています。PDF互換ありで保存したファイルのうち、サイズが小さくなっているのは2cだけです。
この結果から、次のことが分かります。
・画像非表示の方法は、埋め込み画像に対しても有効
・ただし、編集時点で画像を埋め込んでおく必要がある

2gのファイルサイズが小さくならないのは、非表示にした画像が、保存時の埋め込みに伴って表示されてしまうことが理由です。

検証3:第二階層より下で「非表示」 → 軽くなる

画像を非表示にする操作を、どのレベルで行うかも、結構大事です。
4種類の方法を試した結果を、それぞれ、レイヤーパレットの様子と、その下のファイルサイズで示します。

画像8

条件3a・3b・3cは同じレイヤー構造で、非表示操作の深さを変えたものです。3a以外でファイルサイズが小さくなりました。3dは、3aに上位レイヤーを追加し、その直下にそれまでのレイヤー構造を丸ごと入れたものです。3aと3dで非表示にしたレイヤーは同じものですが、サブレイヤー化した3dでファイルサイズが小さくなりました。

つまり、ファイルサイズを小さくするコツは、第二階層より下で画像を非表示にすることです。非表示にする対象が画像そのものか、その上のグループやサブレイヤーなのかは、ファイルサイズ縮小の点では自由です。
ちなみに、検証1と2で画像を表示なしとしたファイルは、すべて3cの方法(画像ごとに個別)で非表示にしました。

さて、非表示にする方法が3b・3c・3dとある中で、どれを選ぶのが良いでしょうか。ここからは、運用を考慮した選択となってきます。

一番手っ取り早いのは3dですが、プレビューできるものが無くなります。3cならばプレビューできるものを一番多く残せますが、最低でも画像の数だけ操作を繰り返す必要があります。残る3bですが、千差万別のファイルで画像を含む構造を把握していくのは、それなりの手間と間違いの元です。チームで仕事する場合は、担当者によって作業の質に差が出るでしょう。

画像8

私は3cを選んでいます。ただし、スクリプトで操作を自動化し、3cの欠点を補うようにしています。

スクリプト

配置画像の表示を切り替えるスクリプトです。
使い方:イラレスクリプト ← 使用の前にご一読ください。

スクリプトの説明:
■ 変更対象はリンクファイルおよび埋め込み画像、変更内容はそれらの表示状態です。■ アクティブなIllustratorファイルに含まれる上記変更対象について、表示中のものは非表示へ、非表示のものは表示へ切り替えます。■ 表示切り替えの過程で、変更対象の上位レイヤーの非表示とロックを解除し、その後、元に戻します。■ 変更対象またはその上位階層のオブジェクト(グループやレイヤーなど)の名前が、レイヤーパレット上で半角スラッシュ2本(//)で始まる場合、表示切り替えをスキップします。つまり、//で始まる名前をつけることで、表示または非表示の状態を意図的に保持することができます。■ このスクリプトはファイルの保存を行いません。

以下、上記jsxファイルのコード全文です。

//Copyright (c) 2020 Kohri224
//Released under the MIT license: https://opensource.org/licenses/mit-license.php
//v1.0.0, 2020/07/20: https://note.com/kohri244/n/n779e242c6f4f

(function(){

   if (app.documents.length > 0){
       var plc = app.activeDocument.placedItems,
           rst = app.activeDocument.rasterItems
       iterateToggleHidden (plc)
       iterateToggleHidden (rst)
   }
   
   function iterateToggleHidden(arr){
       var i, imax = arr.length
       var pla = [], vsbl = [], lckd = []

       for (i=0; i<imax; i++){
           if (!hasExemptedMember(arr[i])){
               pla = getParentLayersArray(arr[i])
               vsbl = storeLayersStatus(pla, "visible")
               lckd = storeLayersStatus(pla, "locked")
               setLayersEditable(pla)
               toggleHidden(arr[i])
               restoreLayersStatus(pla,vsbl,lckd)
           }
       }    
   }

   function hasExemptedMember(tgt){
       var buf = tgt, reg = /^\/{2}/
       if (buf.typename == "Document"){
           return false
       } else if (reg.test(buf.name)){
           return true
       } 
       return (hasExemptedMember(buf.parent))
   }

   function getParentLayersArray(tgt){
       var arr = []
       var buf = tgt
       while (buf.typename !== "Document"){
           if (buf.typename == "Layer"){
               arr.unshift(buf)
           }
           buf = buf.parent    
       }
       return arr
   }

   function storeLayersStatus(tgt,property){
       var arr = [], i, imax = tgt.length
       for (i=0; i<imax; i++){
           arr.push(eval("tgt[i]." + property))
       }    
       return arr
   }

   function setLayersEditable(arr){
       var i, imax = arr.length
       for (i=0; i<imax; i++){
           arr[i].locked  = false
           arr[i].visible = true
       }
   }

   function toggleHidden(tgt){
       (tgt.hidden == true)
       ?tgt.hidden = false: tgt.hidden = true
   }

   function restoreLayersStatus(arr,vsbl,lckd){
       var i, imax = arr.length
       for (i=0; i<imax; i++){
           arr[i].visible = vsbl[i]
           arr[i].locked  = lckd[i]
       }
   }

})()

実行結果は、レイヤーパレットなどでご確認ください。
一例として、本記事のヘッダ画像のような状態で画像の表示/非表示を切り替えることができます。

まとめ

・配置画像を非表示にすると、ファイルサイズを小さくできる
・ただし、非表示操作は第二階層以下で、埋め込みする場合の操作は編集時点で、行う必要がある
・非表示の作業をスクリプトで自動化できる

***
スクリプトがお役に立てば幸いです。
(郡つよし)

画像出典 / Image Credits:
The author thanks to these Pixabay contributors; Alexas_Fotos for the image of the Lion, blende12 for the Baboon, Pixel-mixer for the Bear, christels for the Ferret, and RogerMayhem for the Dog.
All these reviving images are distributed under the “Pixabay License” at https://pixabay.com.

この記事が気に入ったらサポートをしてみませんか?