09-06 Android图像圧缩利器——Luban(鲁班)、知能指数二百五......

2352 ワード

先日、画像のアップロードをしていたとき、画像の圧縮をする論理はありませんでした.そこで一連の面倒な問題が発生した.流量を浪費し、資源を消費し、速度が遅い......うん......本当の技術を見せる時だ.ルバンマスター:Luban(ルバン)--Android画像圧縮ツール、微信のモーメンツ圧縮戦略を真似てもらう.
スタート
古い規則は、原文のスタンプを見るのが好きです.魯班--微信の友达の輪の圧縮戦略を真似します.
プロジェクトの説明
現在、App開発を行うには、画像という要素が欠かせない.しかし、携帯電話の写真解像度が向上するにつれて、画像の圧縮は重要な問題となっている.単純に画像を裁断するだけで、圧縮には多くの文章が紹介されています.しかし、どれだけ裁断するか、どれだけ圧縮するかは制御しにくい.裁断しすぎる画像は小さすぎて、品質が圧縮しすぎると表示効果が悪い.
そこでApp大手の「微信」がどのように処理されるかを考えると、Luban(ルバン)は微信のモーメンツに100枚近くの異なる解像度の画像を送信することで、原図と微信の圧縮後の画像を逆方向に推定した圧縮アルゴリズムである.逆方向推定なので、効果はまだ微信とそっくりではありませんが、微信のモーメンツ圧縮後の効果に近いので、具体的には以下の対比を見てみましょう.
効果と比較
内容
原図
Luban
Wechat
スクリーン720 P
720*1280,390k
720*1280,87k
720*1280,56k
スクリーンショット1080 P
1080*1920,2.21M
1080*1920,104k
1080*1920,112k
写真撮影13 M(4:3)
3096*4128,3.12M
1548*2064,141k
1548*2064,147k
撮影9.6 M(16:9)
4128*2322,4.64M
1032*581,97k
1032*581,74k
スクロールスクリーン
1080*6433,1.56M
1080*6433,351k
1080*6433,482k
インポート
compile 'top.zibin:Luban:1.1.3'

使用
ひどうきよびだし
Luban内部はIOスレッドを用いて画像圧縮を行い、外部呼び出しは結果の傍受を設定するだけでよい.
Luban.with(this)
        .load(photos)                                   //           
        .ignoreBy(100)                                  //           
        .setTargetDir(getPath())                        //            
        .setCompressListener(new OnCompressListener() { //    
          @Override
          public void onStart() {
            // TODO        ,         loading UI
          }
          @Override
          public void onSuccess(File file) {
            // TODO        ,          
          }

          @Override
          public void onError(Throwable e) {
            // TODO             
          }
        }).launch();    //    

シンクロコール
同期方法は、メインスレッドがブロックされないようにメインスレッドで呼び出さないようにしてください.以下、rxJava呼び出しを例に挙げます.
Flowable.just(photos)
    .observeOn(Schedulers.io())
    .map(new Function, List>() {
      @Override public List apply(@NonNull List list) throws Exception {
        //               
        return Luban.with(MainActivity.this).load(list).get();
      }
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe();