画像加工・配信サービスCloudinaryが便利すぎる

Cloudinaryという画像(や動画)をクラウドで管理するためのサービスがあるのですが、このサービスが実に便利っぽいので簡単に紹介したいと思います。

cloudinary.com

もちろん世の中には画像管理や共有のためのサービスはたくさんあるのですが、Cloudinaryには以下のような特徴があります。

  • 様々な言語やフレームワーク向けにライブラリが提供されている(RailsPHP、Node、Django、AngularJS、jQueryScalaiOSAndroid等)
  • 簡単に画像の加工を行うことができる(アップロード時にAPIで行ったり、管理画面から手動で行ったり、参照時のURLにパラメータを指定して行うことができる)
  • 加工の種類が豊富(リサイズやトリミングなどはもちろんのこと、人物っぽい部分を切り出したりみたいなことも可能)
  • タグ付けやアクセス制御、S3からのインポートやS3へのバックアップなどの運用系の機能が充実している

試しにScala用のライブラリを使ってアップロードしてみます。build.sbtに以下の依存関係を追加します。

resolvers += "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"

libraryDependencies += "com.cloudinary" %% "cloudinary-core-scala" % "0.9.7-SNAPSHOT"

こんな感じでアップロードできます(APIキーとかはサインアップ後の管理画面で確認できます)。

import com.cloudinary._
...
val cloudinary = new Cloudinary(Map(
  "cloud_name" -> "my_cloud_name",
  "api_key" -> "my_api_key",
  "api_secret" -> "my_api_secret"
))

val file = new File("test.png")
val result = cloudinary.uploader.upload(file, UploadParameters(Map(
  "public_id" -> "1234", // IDを指定
  "tags" -> "special, for_homepage" // タグを指定
)))

ここではjava.io.Fileを渡していますが、バイト配列を渡してアップロードすることもできます。また、public_idを指定しておくとその名前で参照できたり、tagsを指定しておくとあとからタグを指定して一括削除できたりします。

アップロード時に変換処理を行う場合はtransformationを指定します。

cloudinary.uploader.upload(bytes, UploadParameters(Map(
  "public_id" -> "1234",
  "transformation" -> Transformation().width(40).height(40),
  "tags" -> "special, for_homepage"
)))

アップロード後に管理画面から手動で加工を行うこともできます。

f:id:takezoe:20151204142902p:plain

アップロードした画像をHTMLから参照する場合はこんな感じ。

<img src="http://res.cloudinary.com/demo/image/upload/1234"/>

加工を行う場合はURLにパラメータを指定します。リサイズするならこんな感じ。画像加工のオプションについてはこちらを参照してください。

<img src="http://res.cloudinary.com/demo/image/upload/h_150,w_100/1234"/>

こんな感じで手軽に利用することができます。無料プランも用意されていますので試してみてみるといいと思います。

ただ、Scalaインターフェースは使ってるasync-http-clientのバージョンがちょっと古いみたいで、Dispatch 0.11.3と組み合わせて使ったら実行時にNoClassDefFoundErrorが出てしまいました。まだSNAPSHOTしか提供されていないので、もしかするとScalaの場合でもJava用のライブラリを使ったほうがよいかもしれません。