プログラミング 美徳の不幸

Ruby, Rails, JavaScriptなどのプログラミングまとめ、解説、備忘録。

SDWebImageのWebP対応でwebp/decode.hがないというエラー

SDWebImageってのはこの記事にあるようにiOSの開発で画像を別スレッドで読み込む+キャッシュするみたいな、常識的に気の利いた実装をカジュアルにできるライブラリとしてデファクトのものです。

qiita.com

で、WebPってのはこの記事にあるようにGoogleが策定してる新しい画像フォーマットで従来のjpeg, pngに比べて劣化なしで25%くらいサイズを節約できる画像形式です。

techlife.cookpad.com

ただ、当然WebPは他の画像と一緒で通信時には当然複雑なテキストのような形式のものと端末側でデコードして画像にするので、画像フォーマットとしてデファクトjpeg, png, gifに比べクライアント側のデコードの実装がまちまちなのが難点です。 ざっと調べた感じだとブラウザはchrome以外ほぼ使えない。しかも右クリックしたときの挙動がほかの画像と違うことがあるとか、そもそもあまりサイズの圧縮に効果がないときがあるとか、いろいろ言われてます。

しかし、今回実験としてかなり巨大な2MBくらいある画像データをなんとかして見た目の劣化を少なく100KBくらいにできないものかといろいろな圧縮ツールをためしてみたんですが、jpegoptimとかconvert -qualityに比べて圧倒的にパフォーマンス良かったんですね。 2MBが150KBくらいになった。ちなみに他のツールだと1.3MBとか900KBが限界。

というわけで、ベストエフォートだとかなりの節約になるのがわかったのでなんとかiOSで使えないかと試していました。

** 何かがおかしい

cccookie.hatenablog.com

上の記事だとcocoapodsでSDWebImageとサブモジュールのSDWebImage/WebPを入れれば終わりって書いてあるけど謎のエラーが。とりあえず3.7.0から3.7.3まで試したんですが全てで

f:id:tkot:20151009002328p:plain

webp/decode.hがないって怒られるんですね。

一応動作環境を書くと

です。

最初何かビルド時のフラグみたいなのがおかしいのかなと思っていろいろ試したんですが最終的にはgithubで以下のPRを発見。

github.com

というわけで、エラーが発生するSDWebImage/WebP/UIImage+WebP.m

#import "webp/decode.h"
を
#import <libwebp/webp/decode.h>

に書き換えたらうまく行った。

** 暫定対応

トラブった時にライブラリ側を勝手に変更したりモンキーパッチを作るのは中長期的には負債になるんだけど、今回の場合はライブラリ側で発見されている問題で、PRが出てることからいずれ修正版がリリースされることになると思う。 したがってそれまでは手元で勝手に修正するという方式を採用したほうがクリーンだと思う。