プロジェクト

全般

プロフィール

機能 #1066

複数のサイズが提供されている画像は、各サイズの画像情報を捨てずに扱う

toshi_a 初音14日前に追加. 9日前に更新.

ステータス:
新規
優先度:
通常
担当者:
対象バージョン:
開始日:
2017-09-06
期日:
進捗率:

0%

プラグイン名:

説明

やりたいこと

現在のmikutterでは、Twitter画像のオリジナルサイズや、他のサイズのものを取得する方法がなく、常にlargeが使われている。そのため、次のような問題が発生している。

  • 取得したい画像のPixbufが小さく、smallが適切な場合でもlargeを取得してしまっている
  • 画像ビューアプラグインがオリジナルサイズにアクセスできないため、largeを最大サイズの画像として表示してしまっている

これらを、後方互換性を保ったうえで開発者が適切な画像を選択できるようにしたい。

variantの種類

画像を以下の3種類に分ける。originalは、fitのうち最大のものなので、variantとして用意する必要はないかもしれない

  • fit : オリジナルを、アスペクト比を保って縮小した画像
  • crop: オリジナルの一部を切り取って縮小した画像
  • (original): オリジナル画像。二つ以上存在できないので、専用のフィールドにしても良いかも

variantを保持する方法

Photo Variantsは、内部に複数のPhoto Variantを持つ。
Photo Mixinをincludeしており、download!に指定されたサイズから適切なPhoto Modelを選択する機能をもつ。

Photo Variantは、variantの名前、Photo Model、幅、高さの情報を持たせる。Variantを作る時には、必ず幅と高さ情報が必要となる。ただし、オリジナルに関してはその必要がない(最も大きいと仮定できるため)。

Photo Model#download

現在は、指している画像をダウンロードするだけだが、要求するサイズ(width, height)を設定できるようにする。
Photo Modelはこれを無視するが、Photo Variantsはこの要求に応じてダウンロードする画像を変える。

completed?などの状態を管理するメソッドや、blobフィールドの戻り値については検討しなければいけない(判明している最大のvariantか、originalのどちらかを返せばいい?)。

現実的にはPhoto Variantsのblobは参照されることはない。downloadメソッドの返すDeferredは、Photo Modelを伴って呼ばれるようになっているので、Photo Variantsではなく最終的に選択されたPhoto Modelを渡すことになる。

variantの選択

問題「取得したい画像のPixbufが小さく、smallで十分な場合でもlargeを取得してしまっている」を解決するため、要求サイズを上回る、できるだけ小さいPhoto Modelを選択する。

アスペクト比による選択

pixbufメソッドは、要求されたサイズに内接するようにアスペクト比を保って縮小(fitcrop)された画像を返すことになっている。したがって、利用するvariantはfitとoriginalだけとなる。

小さすぎるvariantは除外する

Photo Variantのサイズを見て、widthまたはheightが小さすぎる場合は、候補から外す。
Photo Modelでは、小さな画像を無理やり引き伸ばして返すことはしない。

最小のvariant

要求サイズより大きいPhoto Variantだけが残るので、この中から最も小さいものを選ぶことでメモリとネットワークトラフィックの節約を狙う。
具体的には、Photo Variantsのdownloadメソッドが、選択されたvariantのdownloadメソッドを呼ぶ。


関連するチケット

関連している 機能 #817: URLを補足するような情報を取り扱う仕組み 新規 2016-02-20

関係しているリビジョン

リビジョン 99fda75f (差分)
toshi_a 初音11日前に追加

同一画像の複数のvariantを保持 refs #1066

リビジョン e04c6885 (差分)
toshi_a 初音10日前に追加

Photo Model: ダウンロードしたい画像サイズのヒントを受け取り、適切な実画像を選択する refs #1066

リビジョン 182dc4be (差分)
toshi_a 初音10日前に追加

Photo Modelを毎回作らずに、メモリ上にあるものを再利用する refs #1066

リビジョン fe6e694b (差分)
toshi_a 初音9日前に追加

Photo.#generateに渡すVariant情報は使われない場合があるので、必要になるまで生成しない refs #1066

リビジョン 74e270fb (差分)
toshi_a 初音9日前に追加

photo: InnerPhotoのインスタンスを使いまわす refs #1066

履歴

#1 toshi_a 初音14日前に更新

  • 関連している 機能 #817: URLを補足するような情報を取り扱う仕組み を追加

#2 toshi_a 初音9日前に更新

単一の画像を扱う Plugin::Photo::InnerPhoto を親切し、 Plugin::Photo::Photo に、variantを扱う機能を追加した。

残りのタスク

  1. より大きなvariantがメモリキャッシュされていても、可能な限り小さいvariantを要求してしまい、無駄なダウンロードが発生することがある。対象となりうるvariantのうち、既にダウンロードされてメモリ上にあるvariantを利用したい。(例えばlargeがダウンロード済みの時、mediumを要求されたらlargeを利用する)
  2. GdkPixbufはvariant毎にキャッシュされるため、実質同じPixbufが複数のvariantにキープされる可能性がある。要求サイズより大きいvariantであればどれを縮小してGdkPixbufを作っても同じなので、GdkPixbufのインスタンスプールをそれらのvariantで共有する

他の形式にエクスポート: Atom PDF