Facebook Spectrumは、iOSとAndroidに向けた新たなオープンソースの画像処理ライブラリである。画像のアップロードプロセスをより効率的にし、信頼性を高め、画像の品質とファイルサイズの最適なバランスを取ることを目指している。
モバイルカメラハードウェアが急速に進化しているように、われわれの電話もどんどん大きなファイルをキャプチャし、保存していきます。これらの大きなファイルをアップロードするとモバイルデータは食いつぶされます; ロードするのに一生かかります; ファイルを全くロードできないときもあります。
加えて、大きな画像をアップロードすることが単に無駄なこともよくある。なぜなら画像はしばしば受信者のためにリサイズされるからだ。これらの理由からSpectrumは、アップロードする前にデバイスで画像をコード変換するというアプローチに従っている。このことは画像フォーマットと開発者の品質要求に従って、”レシピ”と呼ばれる変換リストに生きている。それゆえ、各画像においてライブラリはレシピを解析し、例えばアップロード、トリミング、回転など、要求された処理に関して最も効率的で、劣化が少ない”レシピ”を選ぶ。
最終的な画像サイズに影響する最も重要な要素である画像のリサイズは、サンプリングまたは補間技術を利用することによって仕上げられ、Spectrumは要求される変換の種類を基に、どの技術を適用すべきか決定することができる。例えば、サンプリングは常に補間よりも効率的であるが、入力および出力画像サイズで与えられた比率でしか適用できない。多数のケースにおいて最も効率的な技術の選定を可能にするため、Spectrumは”ぴったり、または小さく”や、”ぴったり、または大きく”など、おおよその出力画像サイズの仕様のサポートしている。これにより、例えばサンプリングを使用できるように、出力画像サイズを調整できるようになる。
以下は、アップロードのためにSpectrumを使って画像をコード変換する例である:
FSPEncodeRequirement *encodeRequirement =
[FSPEncodeRequirement encodeRequirementWithFormat:FSPEncodedImageFormat.jpeg
mode:FSPEncodeRequirementModeLossy
quality:80];
FSPTransformations *transformations = [FSPTransformations new];
transformations.resizeRequirement =
[[FSPResizeRequirement alloc] initWithMode:FSPResizeRequirementModeExactOrSmaller
targetSize:CGSizeMake(2048, 2048)];
FSPEncodeOptions *options =
[FSPEncodeOptions encodeOptionsWithEncodeRequirement:encodeRequirement
transformations:transformations
metadata:nil
configuration:nil
outputPixelSpecificationRequirement:nil];
NSError *error;
FSPResultData *result = [FSPSpectrum.sharedInstance encodeImage:image options:options error:&error];
上述のコードからわかるように、フォーマットと要求する品質レベルを指定することによりJPEGイメージをエンコードできる。劣化を許すか、無劣化か、画像フォーマットに関連するあらゆる属性、スケールダウンといった期待する変換のセットなど。どのような方法でコード変換を行うかなど、下層にある詳細は一切規定する必要はない。
SpectrumはC++ coreで書かれており、JavaやObject-C APIを提供している。JPEG、PNG、WebPフォーマットの画像をサポートしており、汎用プラットフォームAPIによってサポートされるものを超え、画像エンコーディングのきめ細やかなコントロールにMozJpegやlibpngなどのネイティブライブラリを利用している。GitHubからダウンロードできる。