Android 實現(xiàn)圖片灰色模式

Glide依賴

dependencies {
    api fileTree(include: ['*.jar'], dir: 'libs')

    // 如果沒有升級androidx,使用4.9.0版本
    api 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    api "com.github.bumptech.glide:okhttp3-integration:4.11.0"
}

AppGlideModule配置

核心變換設(shè)置的地方
// 此處可以讀取一個開關(guān)莽红,來決定圖片是否用黑白模式
// requestOptions.bitmapTransform(new GrayscaleTransformation());

import android.content.Context;
import androidx.annotation.NonNull;

import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory;
import com.bumptech.glide.module.AppGlideModule;
import com.bumptech.glide.request.RequestOptions;

/**
 * Created by kangyi on 2018/3/20.
 *
 * Glide全局配置膀藐,使用GlideModule注解執(zhí)行自動代碼生成荆永,生成GlideApp,后續(xù)的Glide
 * 調(diào)用都需要替換為GlideApp.with(context).load(url).into(imageView) 的方式
 *
 */
@GlideModule
public class GlobalGlideConfig extends AppGlideModule {

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        super.registerComponents(context, glide, registry);
    }

    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        super.applyOptions(context, builder);

        /**
         * DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容。
         * DiskCacheStrategy.DATA: 表示只緩存原始圖片孩饼。
         * DiskCacheStrategy.RESOURCE: 表示只緩存轉(zhuǎn)換過后的圖片。
         * DiskCacheStrategy.ALL : 表示既緩存原始圖片竹挡,也緩存轉(zhuǎn)換過后的圖片镀娶。
         * DiskCacheStrategy.AUTOMATIC: 表示讓Glide根據(jù)圖片資源智能地選擇使用哪一種緩存策略(默認(rèn)選項)。
         */
        builder.setDefaultRequestOptions(getRequestOptions());

        /**
         * 優(yōu)先外部存儲作為磁盤緩存目錄揪罕,防止內(nèi)部存儲文件過大
         * 外部存儲目錄默認(rèn)地址為:/sdcard/Android/data/com.leo.kang.cetfour/cache/image_manager_disk_cache
         */
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
    }

    /**
     * 獲取Glide的全局配置信息
     * @return
     */
    private RequestOptions getRequestOptions() {
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC);

        // 此處可以讀取一個開關(guān)梯码,來決定圖片是否用黑白模式
//        requestOptions.bitmapTransform(new GrayscaleTransformation());
        return requestOptions;
    }
}

圖片灰化變換

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import androidx.annotation.NonNull;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.weibo.imageloader.GlideConstants;

import java.security.MessageDigest;

public class GrayscaleTransformation extends BitmapTransformation {

  private static final int VERSION = 1;

  private static final String ID = "packagename.GrayscaleTransformation" + VERSION;

  @Override
  public String toString() {
    return "GrayscaleTransformation()";
  }

  @Override
  public boolean equals(Object o) {
    return o instanceof GrayscaleTransformation;
  }

  @Override
  public int hashCode() {
    return ID.hashCode();
  }

  @Override
  public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
    messageDigest.update((ID).getBytes(CHARSET));
  }

  @Override
  protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
    int width = toTransform.getWidth();
    int height = toTransform.getHeight();

    Bitmap.Config config =
            toTransform.getConfig() != null ? toTransform.getConfig() : Bitmap.Config.ARGB_8888;
    Bitmap bitmap = pool.get(width, height, config);

    setCanvasBitmapDensity(toTransform, bitmap);

    Canvas canvas = new Canvas(bitmap);
    ColorMatrix saturation = new ColorMatrix();
    saturation.setSaturation(0f);
    Paint paint = new Paint();
    paint.setColorFilter(new ColorMatrixColorFilter(saturation));
    canvas.drawBitmap(toTransform, 0, 0, paint);

    return bitmap;
  }

  void setCanvasBitmapDensity(@NonNull Bitmap toTransform, @NonNull Bitmap canvasBitmap) {
    canvasBitmap.setDensity(toTransform.getDensity());
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宝泵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轩娶,更是在濱河造成了極大的恐慌儿奶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳄抒,死亡現(xiàn)場離奇詭異闯捎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嘁酿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門隙券,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闹司,你說我怎么就攤上這事娱仔。” “怎么了游桩?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵牲迫,是天一觀的道長。 經(jīng)常有香客問我借卧,道長盹憎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任铐刘,我火速辦了婚禮陪每,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镰吵。我一直安慰自己檩禾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布疤祭。 她就那樣靜靜地躺著盼产,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勺馆。 梳的紋絲不亂的頭發(fā)上戏售,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音草穆,去河邊找鬼灌灾。 笑死,一個胖子當(dāng)著我的面吹牛续挟,可吹牛的內(nèi)容都是我干的紧卒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼诗祸,長吁一口氣:“原來是場噩夢啊……” “哼跑芳!你這毒婦竟也來了轴总?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤博个,失蹤者是張志新(化名)和其女友劉穎怀樟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盆佣,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡往堡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了共耍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虑灰。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖痹兜,靈堂內(nèi)的尸體忽然破棺而出穆咐,到底是詐尸還是另有隱情,我是刑警寧澤字旭,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布对湃,位于F島的核電站,受9級特大地震影響遗淳,放射性物質(zhì)發(fā)生泄漏拍柒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一屈暗、第九天 我趴在偏房一處隱蔽的房頂上張望拆讯。 院中可真熱鬧,春花似錦养叛、人聲如沸往果。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堕油,卻和暖如春潘飘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掉缺。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工卜录, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眶明。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓艰毒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搜囱。 傳聞我的和親對象是個殘疾皇子丑瞧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容