Cloudinaryの画像変換パラメータまとめ 〜 リサイズと最適化
こんにちは!東京から伊藤です!
明日のCloudinaryハンズオンセミナーを控え、今回はCloudinaryで使用する配信URLとその画像変換パラメータについて説明します。基本的にはCloudinaryのドキュメントに沿ってまとめていきます。
画像変換パラメータのまとめ記事の一覧はこちら:
- 【今回】リサイズと最適化
- 形・スタイル
- オーバーレイ・アンダーレイ
- エフェクト
Cloudinaryの配信URL
Cloudinaryを使って画像や動画、その他アセットの配信ができますが、それらはHTTP/SのURLを使うことでCDNを経由して配信されます。そして、そのURL内でパラメータを指定することによって、画像や動画の動的な変換を行います。
その配信URLは、下記のように構成されています。
https://res.cloudinary.com/[クラウド名]/[リソースタイプ]/[タイプ]/[署名]/[変換パラメータ]/[バージョン]/[パブリックID].[フォーマット]
- [クラウド名]: Cloudinaryアカウント名
- [リソースタイプ] (※任意):
image
(デフォルト)、raw
、video
のいずれか - [タイプ] (※任意):
upload
(デフォルト)、private
、authenticated
、fetch
、facebook
、youtube
など(詳細はDelivery types) - [署名] (任意): 署名付きURLの場合に
/s--SIGNATURE--/
形式で指定(詳細はSigned delivery URLs) - [変換パラメータ] (任意): カンマ区切りで指定(何も指定しないとオリジナルのファイルが配信される)
- [バージョン] (任意): ファイルをバージョン管理する場合のバージョン指定で、デフォルトでは
v
にアップロード時間のUNIXタイムスタンプの数字が続く(ストレージのファイルを更新しても、同じURLパスでアクセスすると明示的にCDNキャッシュを消さない限り古い状態のファイルが表示されるため、ファイル更新時にURLパスを変更するためにバージョンを含める) - [パブリックID]: アカウント内で一意の名前(ファイル名、またはアップロード時にCloudinaryによるランダムな文字列付与)で、フォルダ階層下にある場合はスラッシュ区切りでパスも含む
- [フォーマット] (任意): ファイルの拡張子(オリジナルからフォーマットを変更しない場合は、省略可能)
※[リソースタイプ]と[タイプ]は、こちらのブログ内でも紹介されているルートパスURLという機能で、image/upload
の場合にのみ省略することができます。
[変換パラメータ]は、画像を変換し、さらにそこから変換、のように組み合わせることができます。この場合にはスラッシュ区切りで繋げます。例えば、 c_fill,h_400/l_logo,c_scale,h_100
では元の画像を高さ400へ変換し、さらにロゴを高さ100としてオーバーレイで組み合わせます。
画像の変換パラメータ
ここからは、[変換パラメータ]内で指定する画像の変換オプションについて説明します。
最適化
フォーマット
ファイルを適切なフォーマットに変更することによりサイズを小さくすることが期待できます。特に、f_auto
ではブラウザに応じた適切なフォーマット選択が行われます。
■最適フォーマット選択: f_auto
f_auto
を指定すると、圧縮が見込める際に対応ブラウザで自動的にフォーマット変換されます。現状、Chromeの場合はWebP、IEの場合はJPEG-XRが選択される可能性があります。
実際の使用例とこの機能のすごさはこちらのブログから確認できます。
■特定フォーマットへの変換
画像や動画を特定のフォーマットへ変換するには、URL末尾の[フォーマット]で指定するだけです。サポートされる画像フォーマットと動画フォーマットはドキュメントを参照してください。
例えば、[パブリックID]が "sample" のjpgファイル(またはアップロードしたファイル名が "sample.jpg")をGIFに変換して配信するには、下記のように末尾の拡張子を .gif
に指定するだけです。
- 元のjpgファイル
https://res.cloudinary.com/demo/image/upload/sample.jpg
- 変換するgifファイル
https://res.cloudinary.com/demo/image/upload/sample.gif
■特定フォーマットへの変換(fetchの場合)
fetch を使って外部のURLから取り込む場合には、先の方法ではいけません。この場合は、変換パラメータ内にf_
で拡張子を指定します。以下の例ではjpgをpngに変換しています。
https://res.cloudinary.com/demo/image/fetch/w_400,f_png/https://upload.wikimedia.org/wikipedia/commons/4/46/Jennifer_Lawrence_at_the_83rd_Academy_Awards.jpg
品質(圧縮)
画像の解像度とファイルサイズはトレードオフですが、適切な解像度にまで圧縮しても視覚的な見栄えはそんなに変わらないケースがあり、そのレベルを指定することができます。
各パラメータを指定したプレビューは、ドキュメントから確認してみてください。
■最適品質選択: q_auto
q_auto
を指定すると、画像の内容と閲覧ブラウザに応じて最適な圧縮レベルをCloudinaryが判別して配信します。追加で:
に続けて以下のようなオプションを付与できます。なお、auto
のデフォルトはq_auto:good
で、ユーザが対応ブラウザ(現在ChromeとOpera)でデータ節約モードをONにしている場合、q_auto:echo
が選択されます。
パラメータ | 説明 |
---|---|
best | 圧縮は控えめで高品質を保つ |
good | 比較的小さいファイルサイズで良品質にする |
eco | 強めに圧縮し、やや見栄えを損なう可能性がある |
low | 最も強い圧縮で、見栄えの品質も下がる |
■特定圧縮レベルへの変換
q_
に続けて1(最低)から100(最高品質)で圧縮レベルを指定します。なお、何らかの変換パラメータが指定されると、自動的にq_80
が適用されて配信されます。
リサイズ
幅・高さサイズ
幅はw_
、高さはh_
で、これらに続けて実際に指定するピクセルサイズ(w_150
など)、または元からの割合(w_0.5
など)でパラメータ指定します。幅と高さのいずれか、または両方を指定でき、片方を指定した場合はアスペクト比を保持してスケールされます。
リサイズ・切り抜きモード
指定した幅・高さサイズに対して、スケールや切り抜きの方法を指定します。パラメータはc_
から始まり、ドキュメントでも例と共に確認できます。太字のパラメータは後述で例示します。
パラメータ | 説明 | オプション |
---|---|---|
scale | 指定サイズの通りにスケール;指定によっては比率が崩れる | - |
fit | アスペクト比を維持したまま指定サイズ内に収めるようリサイズ | - |
limit | fitと同様だが、オリジナル以下のサイズにする場合のみ | - |
minimum fit (mfit) | fitと同様だが、オリジナル以上のサイズにする場合のみ | - |
fill | 指定サイズを満たすようスケール後、余った部分を切り取り;gravityで残す範囲を指定 | gravity |
limited fill (lfill) | fillと同様だが、オリジナルが指定サイズより大きい場合のみ | gravity |
crop | 元のスケールを維持したまま、指定のサイズに切り取り;gravityで切り取り範囲を指定 | gravity, xy |
thumb | サムネイル向けで、顔やカスタム範囲を含めつつ指定サイズにスケール&切り取り | gravity |
pad | アスペクト比を維持したまま指定サイズ内に収めるようリサイズし、余白は背景とする;backgroundで背景、gravityで(余白に対する)画像の位置を指定 | background, gravity |
limit & pad (lpad) | padと同様だが、オリジナル以下のサイズにする場合のみ | background, gravity |
minimum pad (mpad) | padと同様だが、オリジナル以上のサイズにする場合のみ | background, gravity |
変換パラメータを適用したURLは、例えば下記のようになります。
https://res.cloudinary.com/CLOUD-NAME/image/upload/c_fill,w_200/ito-test/Reichstag.jpg
ただし、このように幅または高さのどちらかだけを指定する場合、c_fill
をc_scale
、c_fit
、c_pad
に置き換えても、同様の200x150の画像が返ってきます。一方、c_crop
については、200x150の画像ですが、元の画像からスケールせずに切り取られるため結果が異なります。
※これはイメージで、影は実際には付与されません。
一方、幅と高さの両方を指定すると結果が異なります。以下は200x200のc_fill
です。
https://res.cloudinary.com/CLOUD-NAME/image/upload/c_fill,w_200,h_200/ito-test/Reichstag.jpg
このc_fill
を置き換えるとそれぞれ以下のようになります。
c_fill
は200x200で余った横幅が切り取られていて、c_scale
はそのままスケールしていて写真が縦長になっており、c_fit
は横幅に合わせていて200x150に、c_pad
はfitに似ていますが200x200で余白が塗られています。
焦点を当てる位置を指定するもので、パラメータはg_
から始まります。
デフォルトは center
(中央)で、方角を使ってnorth
(北=上)、north_east
(北東=右上)、south_west
(南西=左下)といった指定の仕方もできます。
他には下記のようなパラメータがあります。
パラメータ | 説明 |
---|---|
face | 自動的に最大の'顔'を見つけ、焦点を当てる;顔が自動検知されない場合、デフォルトはnorth、g_face:auto はauto、g_face:center はcenterとなる;手動で顔の範囲を指定すると自動検知から上書き |
faces | faceと同様だが、すべての顔を含めようとする |
custom | 指定されたカスタムの範囲に焦点を当てる;カスタム範囲がない場合、centerとなる |
custom:face(s) | customと同様だが、カスタム範囲がない場合、face(s)となる |
xy_center | XY座標で指定した点に焦点を当てる(指定方法は後述のXY座標) |
adv_face(s) | アドオンで高度な顔検知により自動的に'顔'を見つけ、焦点を当てる |
adv_eyes | アドオンで高度な顔検知により自動的にすべての目を見つけ、焦点を当てる |
custom:adv_face(s) | customと同様だが、カスタム範囲がない場合、adv_face(s)となる |
ocr_text | アドオンでOCR認識によりテキスト要素を検知し、焦点を当てる |
auto | インテリジェントなアルゴリズムで分析して大事そうな要素を枠に含める |
g_auto
についてはさらなる機能がありますが、詳細はドキュメントをご確認ください。
以下の例では、c_fill,w_200,h_300
に加えて3つの異なるgravityパラメータを指定した違いです。g_faces:auto
では顔が判別されず、auto
と同じ結果になっています。
c_crop
と組み合わせ、指定したXY座標の地点から右下方向の指定サイズの範囲が切り取られます。左上の端からの距離をX(横)Y(縦)の値で示し、gravityの代わり、または組み合わせて使用できます。
以下の例では 幅 1000 にスケールした後(c_scale,w_1000/)、左上の端から右に250(x_250)、下に250(y_250)の地点から500x200で切り取っています。
c_pad
と組み合わせ、背景色や背景画像を指定します。パラメータは b_
から始まり、大きく以下の3つの指定方法があります。
- 色: 色名(
b_green
、b_pink
など) - RGB: 6桁または3桁のRGBで、#は省略(
b_rgb:3e2222
など) - 自動(
b_auto
): 画像の色に合わせて自動判別
b_auto
は追加で:
に続けて以下のようなオプションを付与できます。なお、auto
のデフォルトはb_auto:border
です。
パラメータ | 説明 |
---|---|
border | 画像の境界の主要な色を選択 |
predominant | 画像内の主要な色を選択 |
border_contrast | 画像の境界の色からコントラストカラーを選択 |
predominant_contrast | 画像内の主要な色からコントラストカラーを選択 |
以下の画像の例では、c_pad,h_200,w_200
に加えてb_auto:border
とb_auto:border_contrast
をそれぞれ適用しています。なお、今回は画像の境界および画像内とも主要な色が空の水色と判断されたため、border
とpredominant
は同じ結果となりました。逆も然りなので、contrast
とpredominant_contrast
とも同じでした。
また、ここでは前述のgravityとXYのオプションを組み合わせ、200x200の枠内で、上寄りから指定したY座標に画像が配置されていることが分かります。
さらに、b_auto
では以下のように色をグラデーションにすることもできます。
b_auto:[グラデーションタイプ]:[色数]:[方向]:[パレット]
- [グラデーションタイプ]: グラデーションのベースとなる色で、
border_gradient
(画像の境界の主要な色)/predominant_gradient
(画像内の主要な色)/border_gradient_contrast
(画像の境界の色のコントラストカラー)/predominant_gradient_contrast
(画像内の主要な色のコントラストカラー) のいずれか - [色数]:
2
または4
- [方向] (任意): 2色の場合に指定するフェードの方向で、
horizontal
(平行)(デフォルト)/vertical
(垂直)/diagonal_desc
(左上と右下の斜め)/diagonal_asc
(右上と左下の斜め) のいずれか(4色の場合は4辺間が混ざるようにグラデーション) - [パレット] (任意):
palette_
に続け、グラデーションに使用する色をアンダースコアで区切って指定することで、画像内の主要な色に近い色が選択される(選択肢のうち同じ色が複数回使われる可能性もある)
- [グラデーションタイプ]: グラデーションのベースとなる色で、
以下の例ではc_pad,h_200,w_200
に加えてb_auto
でグラデーションのパラメータをそれぞれ適用しています。左上の画像では、主要な2色として深緑と明るい緑が選択されているようで、左上から右下にかけて色が変わっています。右上の画像では主要な4色として3種の緑と赤が判断され、4辺に向かって各色が濃くなっています。左下の画像では赤・緑・オレンジから2色選びますが、赤・オレンジは該当せず、緑一色です。右下の画像では青を加えて4色ですが、緑が3度選択されて青が1辺でグラデーションになっています。
まとめ
いかがでしたでしょうか?
Cloudinaryの画像変換パラメータは、URL内のパラメータ名で比較的分かりやすくなってはいるものの、オプションがあまりにたくさんあるので、今回はリサイズと最適化に関するものをまとめてみました。
クラスメソッドはCloudinaryのパートナーとして導入のお手伝いをさせていただいています。お気軽にこちらからお問い合わせください。こちらから無料でもサインアップいただけます。