1. 程式人生 > >Android圖片處理之Glide使用大全

Android圖片處理之Glide使用大全

        聽說Glide是一個牛逼的圖片載入庫,作者是bumptech,然後這個庫被廣泛的應用在谷歌的官方app裡,也就是谷歌支援我們使用這個來載入圖片庫,所以呢就需要響應谷歌的要求,就像網路訪問我們用volley,然後大部分安卓開發者都棄用eclipse轉戰android studio一樣,現在好的圖片開源庫真是太多了,顯然也是各有特點自己適合才是最好的,所以就來學習下這個Glide的圖片庫,有了android studio開發真是太方便了羨慕

      

  Android Glide是一個開源的圖片載入和快取處理的第三方框架。使用Android的Glide和Android的Picasso庫驚人的相似,基本上會用畢加索的也就會使用這個東東了,個人感覺比Android Picasso好用。Android Glide使自身內部已經實現了快取策略,使得開發者擺脫Android圖片載入的瑣碎事務,專注邏輯業務的程式碼。Android Glide使用便利,短短几行簡單明晰的程式碼,即可完成大多數圖片從網路(或者本地)載入、顯示的功能需求。

一.為什麼要使用Glide

 以前還沒有出Glide、Picasso和Fresco的時候我們最常用的是使用老牌的圖片框架universalImageLoader,universalImageLoader配置相對麻煩,雖然提供了各種配置,但是沒有實踐過,根本不知道如何配置,網上的介紹也很多,總體感覺就是配置太多了,使用起來也還算比較方便吧,總之來說使用eclipse開發的時候這個框架載入圖片感覺是非常的輕鬆,確實也很少出現oom,這裡要給它點個贊,然後也是國產app使用最多的一個圖片載入框架了,一般使用volley去傳送請求,處理圖片時雖然它也帶了ImageLoader和NetworkImageView但是很容易出現oom,然後通常使用volley+universalImageLoader。

           隨著Glide、Picasso和Fresco三個圖片載入庫的出現,我們就更加喜歡用更方便的圖片框架了,universalImageLoader雖然好但是配置多,但是我們使用載入過多的大圖片時,Picasso(畢加索)佔用的記憶體會相當的大,所以如果是要載入很多圖片那麼畢加索可能會OutOfMemoryError的發生,至於Fresco是一個非常強大的圖片載入框架,支援webps格式(和jpg一樣都是有失真壓縮格式,webps相同質量圖片更節省空間),支援漸進式jpeg,可以輕鬆的定製image的各種屬性,支援多圖請求和圖片複用,並支援手勢縮放和旋轉等等(這裡不做比較)。

      所以具體來看Glide和Picasso,Glide載入影象以及磁碟快取的方式都要優於Picasso,速度更快,並且Glide更有利於減少OutOfMemoryError的發生,GIF動畫是Glide的殺手鐗。不過Picasso的圖片質量更高。glide從用法上幾乎就是另一個picasso,從picasso轉移到glide相對改動較少,還有一點就是這個專案是google在維護,我也能給它更多的信任,相比較universalImageLoader,glide可以支援gif和短視訊,後期也需要用到,這裡不得不談一下glide優秀的快取機制了,glide圖片快取預設使用RGB565相當於ARGB8888可以節省不少的空間,支援與activity,fragment,application生命週期的聯動,更智慧管理圖片請求當然還有其他的擴充套件更多可以看 glide介紹 當然,glide的方法數量比universalImageLoader多了1000多個,遇到64k問題的會比較關注這個。

      不說了,反正這些圖片載入框架都是相當 的牛逼,你就看著用好了。

二.Glide的使用

上一篇我們講了畢加索安卓圖片處理Picasso的解析使用,對著上一篇你就會知道Glide和Picasso的使用差不多。

     我們現在就來使用吧,依舊是你想用glide-3.6.1.jar就去下載,放在libs下匯入就好了,如果你使用的是AS那麼就更加簡單了

      你有github賬號就更加好了,沒有那麼你就落後了,趕緊去申請一個,沒有也可以去github去downLoad ZIP,有你就直接git clone https://github.com/bumptech/glide.git

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.github.bumptech.glide:glide:3.6.1'
    compile 'com.android.support:support-v4:23.1.1'
}

從這裡你發現了好像是需要V4包,好像Picasso不要

Or Maven:

<dependency>
    <groupId>com.github.bumptech.glide</groupId>
    <artifactId>glide</artifactId>
    <version>3.6.1</version>
</dependency>
<dependency>
    <groupId>com.google.android</groupId>
    <artifactId>support-v4</artifactId>
    <version>r7</version>
</dependency>
按著說明文件一步步操作就好了:

說明裡面也介紹了去程式碼混淆:在proguard-project.txt或proguard.cfg

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
}
準備工作完了,那就是你要去程式碼使用的時候了:

概括一句話也是

Glide在(with)當前上下文中載入(load)一張圖片到(into)imageView控制元件

現在直接上程式碼,因為和畢加索的使用差不多:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @InjectView(R.id.listview)
    ListView listview;
@InjectView(R.id.single_view_asset)
    ImageView singleViewAsset;
@InjectView(R.id.single_view_res)
    ImageView singleViewRes;
private String[] images;
private  ListViewAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
ButterKnife.inject(this);
//載入本地圖片
initLocal();
//載入網路圖片
initNet();
}

    private void initNet() {
        getImageUrls();
mAdapter=new ListViewAdapter(images,MainActivity.this);
listview.setAdapter(mAdapter);
}

    private void getImageUrls() {
       images= new String[] {
                "http://img.my.csdn.net/uploads/201407/26/1406383299_1976.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383291_8239.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383264_3954.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383264_4787.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383264_8243.jpg",
"http://img.my.csdn.net/uploads/201407/26/1406383248_3693.jpg",
};
}

    private void initLocal() {
        //載入資源圖片
Glide.with(this).load(R.drawable.alipay).into(singleViewRes);
//載入資產目錄圖片
Glide.with(this).load("file:///android_asset/heart.png").into(singleViewAsset);
//載入sd卡圖片檔案
        // Glide.with(this).load(new File("XXX")).into(iv_picasso);}


}
再看介面卡程式碼:ListViewAdapter.java
/**
 * Created by test1 on 2016/1/27.
 */
public class ListViewAdapter extends BaseAdapter{
    private String images[];
private Activity mActivity;
private LayoutInflater mInflat;
public ListViewAdapter(String[] images,Activity mActivity) {
            this.images = images;
this.mActivity = mActivity;
mInflat=LayoutInflater.from(mActivity);
}


        @Override
public int getCount() {
        return images.length;
}

    @Override
public Object getItem(int position) {
        return images[position];
}

    @Override
public long getItemId(int position) {
        return position;
}

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null){

            convertView=  mInflat.inflate(R.layout.list_item,null,false);
ImageView iv= (ImageView) convertView.findViewById(R.id.iv);
Glide.with(mActivity)
                    .load(images[position])
                    .centerCrop()
                    .placeholder(R.mipmap.ic_launcher)
                    .crossFade()
                    .into(iv);
}

        return convertView;
}

還有很多方法:像crossFade()預設動畫,fitCenter(),placeholder()佔位圖,error()錯誤圖,空圖等可以自己試試;

這裡的Glide.with() 不僅可以傳 Context ,還可以傳Activity 和 Fragment,因為圖片載入會和Activity/Fragment的生命週期保持一致,比如Paused狀態在暫停載入,在Resumed的時候又自動重新載入。

效果看圖:


這就是Glide的簡單使用。

三.Glide的其他使用

如果想用Okhttp做協議棧可以直接新增 glide-okhttp-integration-1.3.1.jar ,並且在Application 或Activity 的onCreate 方法註冊就可以使用okhttp做為協議棧,Volley也是同理;

Glide.get(this).register(GlideUrl.class,InputStream.class,newOkHttpUrlLoader.Factory(newOkHttpClient()));

Glide預設的圖片格式是RGB_565所以,要想使用ARGB_8888模式,又想Okhttp做協議棧,就不能用glide-okhttp-integration-1.3.1.jar,直接抽取裡面的OkHttpGlideModule類然後,新增builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

用起來很簡單,說下注意點吧:

1.placeholder() 佔位圖或者失敗圖都可以直接使用R.color.white 顏色來做;

2.如果載入不出來圖片的話可以試試設定下圖片的寬高;

3.圖片快取:圖片的載入並不是全快取,而是使用的imageview的大小來的,如果想要全快取的就可以這樣:

  • DiskCacheStrategy.NONE 什麼都不快取
  • DiskCacheStrategy.SOURCE 僅僅只快取原來的全解析度的影象
  • DiskCacheStrategy.RESULT 僅僅快取最終的影象,即降低解析度後的(或者是轉換後的)
  • DiskCacheStrategy.ALL 快取所有版本的影象(預設行為

.diskCacheStrategy(DiskCacheStrategy.ALL)

4.圖片載入背景會變成綠色,載入jpg圖片會出現的BUG,github上給出解決方案

Glide.with(this).load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView); 或者

Glide.with(this).fromResource().asBitmap().encoder(newBitmapEncoder(Bitmap.CompressFormat.PNG,100)).load(R.drawable.testimg).into(imageView);

5.圓形圖片用V4包自帶的處理方式:

Glide.with(context).load(imageUrl).asBitmap().fitCenter().diskCacheStrategy(DiskCacheStrategy.SOURCE)

.placeholder(R.drawable.shape_glide_round_place).error(R.drawable.no_face_circle)

.into(newBitmapImageViewTarget(imageView) {

@Override

protected voidsetResource(Bitmap resource) {

RoundedBitmapDrawable circularBitmapDrawable =

RoundedBitmapDrawableFactory.create(context.getResources(),resource);

circularBitmapDrawable.setCircular(true);

imageView.setImageDrawable(circularBitmapDrawable);

}

});

5.動畫crossFade()

crossFade() 方法還有另外過載方法 .crossFade(int duration)。如果你想要去減慢(或加快)動畫,隨時可以傳一個毫秒的時間給這個方法。動畫預設的持續時間是 300毫秒。

如果你想直接顯示圖片而沒有任何淡入淡出效果,在 Glide 的建造者中呼叫 .dontAnimate() 。

6.清除快取:Glide.get(this).clearMemory();              

 Glide.get(this).clearDiskCache(); 需要在子執行緒執行

7. 載入暫時不支援顯示進度,可以用佔位圖來顯示,把佔位圖替換成幀動畫,還有錯誤圖片,圖片縮放以及自定義大小

當載入網路圖片時,由於載入過程中圖片未能及時顯示,此時可能需要設定等待時的圖片,通過placeHolder()方法:

Glide
    .with(context)
    .load(imgurl)
    .placeholder(R.mipmap.ic_launcher) // can also be a drawable
    .into(imageViewPlaceholder);
當載入圖片失敗時,通過error(Drawable drawable)方法設定載入失敗後的圖片顯示:
Glide
    .with(context)
    .load(imgurl)
    .error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded
    .into(imageView);
 圖片的縮放,centerCrop()和fitCenter():
Glide.with(MainActivity.this)
                    .load(imgurl)
                    .fitCenter()//縮放型別
                    .into(imageView);
  1. 使用centerCrop是利用圖片圖填充ImageView設定的大小,如果ImageView的Height是match_parent則圖片就會被拉伸填充
  2. 使用fitCenter即縮放影象讓影象都測量出來等於或小於 ImageView 的邊界範圍該影象將會完全顯示,但可能不會填滿整個 ImageView。

圖片自定義顯示大小:

Glide
    .with(context)
    .load(imgurl)
    .override(600, 200) // resizes the image to these dimensions (in pixel). does not respect aspect ratio
    .into(imageViewResize);

8.glide獲取bitmap動態設定圖片大小,通過viewTarget設定自定義view的圖片

1.simpleTarget獲取bitmap根據bitmap設定圖片顯示尺寸:(這裡適配螢幕寬度,高度按比例拉伸)

final ImageView img = new ImageView(context);
		LayoutParams lp = img_content.getLayoutParams();
		lp.width=400;
		lp.height=200;
		img.setLayoutParams(lp);
		Glide.with(ShopActivity.this)
				.load("http://dn-qpos-box.qbox.me/hqs.jpg").asBitmap()
				.into(new SimpleTarget<Bitmap>() {
					@Override
					public void onResourceReady(Bitmap bitmap,
							GlideAnimation<? super Bitmap> glideAnimation) {
						int width = bitmap.getWidth();
						int height = bitmap.getHeight();
						LayoutParams lp = img.getLayoutParams();
						lp.width = SysEnv.SCREEN_WIDTH;
						float tempHeight=height * ((float)lp.width / width);
						lp.height =(int)tempHeight ;
						img.setLayoutParams(lp);
						img.setImageBitmap(bitmap);
						img_content.addView(img);
					}
				});

2.simpleTarget獲取bitmap指定尺寸:
private SimpleTarget target2 = new SimpleTarget<Bitmap>( 250, 250 ) {  
    @Override
    public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
        imageView2.setImageBitmap( bitmap );
    }
};
private void loadImageSimpleTargetApplicationContext() {  
    Glide
        .with( context.getApplicationContext() ) // safer!
        .load( eatFoodyImages[1] )
        .asBitmap()
        .into( target2 );
}
3.viewTarget假設你有一個 Custom View。Glide 並不支援載入圖片到自定義 view 中,因為並沒有方法知道圖片應該在哪裡被設定。然而,Glide 可以用 ViewTarget 更容易實現。
public class FutureStudioView extends FrameLayout {  
    ImageView iv;
    TextView tv;

    public void initialize(Context context) {
        inflate( context, R.layout.custom_view_futurestudio, this );

        iv = (ImageView) findViewById( R.id.custom_view_image );
        tv = (TextView) findViewById( R.id.custom_view_text );
    }

    public FutureStudioView(Context context, AttributeSet attrs) {
        super( context, attrs );
        initialize( context );
    }

    public FutureStudioView(Context context, AttributeSet attrs, int defStyleAttr) {
        super( context, attrs, defStyleAttr );
        initialize( context );
    }

    public void setImage(Drawable drawable) {
        iv = (ImageView) findViewById( R.id.custom_view_image );

        iv.setImageDrawable( drawable );
    }
}
你不能使用常規的 Glide 的方法 .into(),因為我們的自定義 view 並不繼承自 ImageView。因此,我們必須建立一個 ViewTarget,並用 .into()

相關推薦

Android圖片處理Glide使用大全

        聽說Glide是一個牛逼的圖片載入庫,作者是bumptech,然後這個庫被廣泛的應用在谷歌的官方app裡,也就是谷歌支援我們使用這個來載入圖片庫,所以呢就需要響應谷歌的要求,就像網路訪問我們用volley,然後大部分安卓開發者都棄用eclipse轉戰andro

Android - 圖片處理Glide4.0

郭大神關於Glide文章的連線,很詳細 Android圖片載入框架最全解析(一),Glide的基本用法 Android圖片載入框架最全解析(二),從原始碼的角度理解Glide的執行流程 Android圖片載入框架最全解析(三),深入探究Glide的快取機制 Android圖

Android圖片處理Glide 4 介紹

本篇將是我們這個Glide系列的最後一篇文章。 其實在寫這個系列第一篇文章的時候,Glide就推出4.0.0的RC版了。那個時候因為我一直研究的都是Glide 3.7.0版本,再加上RC版本還不太穩定,因此整個系列也都是基於3.7.0版本來寫的。 而現在,Glide的最新版本已經出到

淺談android圖片處理圖形變換特效Matrix(四)

今天,我們就來談下android中圖片的變形的特效,在上講部落格中我們談到android中圖片中的色彩特效來實現的。改變它的顏色主要通過ColorMatrix類來實現。 現在今天所講的圖片變形的特效主要就是通過Matrix類來實現,我們通過上篇部落格知道,改變色彩特效,主要

淺談android圖片處理色彩特效處理ColorMatrix(三)

在android開發中對圖片處理很是頻繁,其中對圖片的顏色處理就是很常見的一種。我們經常看到一些類似美圖秀秀,美顏相機的app,為什麼那麼黑的人拍出來是確實那麼地白呢?長的那麼那個(醜)的人,用美顏相機拍出來的看起來也有那麼回事(拍出來就感覺挺漂亮)。就像網上有個段子,有錢

Android圖片載入框架Glide探究Glide的快取機制

轉載自:http://blog.csdn.net/guolin_blog/article/details/54895665 在本系列的上一篇文章中,我帶著大家一起閱讀了一遍Glide的原始碼,初步瞭解了這個強大的圖片載入框架的基本執行流程。 不過,上一篇文

Android 圖片壓縮的方法大全

方法 nal ons arr reset 註意 you 固定 .com public static Bitmap revitionImageSize(String path) throws IOException { BufferedInputStream in

圖片處理 Base64

col ack 頁面 發送 http 簡單 文件大小 pan class   網頁上的圖片資源如果采用 http 形式的 url 的話都會額外發送一次請求,網頁發送的 http 請求次數越多,會造成頁面加載速度越慢。而采用Base64格式的編碼,將圖片轉化為字符串後,圖

Android圖片處理--縮放

div 大小 cep public date() andro file .get loader PS:在開發中我們會遇到一些圖片處理問題,比如說緩存圖片了、限制圖片大小了、查看圖片了等。上一篇文章介紹了圖片的全景效果查看,今天介紹一個圖片縮放,我們如果有時間的話,可以自己寫

Android 圖片載入框架Glide用法

最近有個需求是,要將 url 地址傳過來的圖片載入到ImageView中,幾番折騰後找到 Glide,真的很好用,所以做下筆記 轉載:https://www.cnblogs.com/guilin-hu/p/5706916.html 在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫&nb

圖片載入Glide使用

一、簡介 在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫Glide的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在Google的開源專案中,包括2014年Google I/O大會上釋出的官方App。 Glide是一款由Bump Techno

Android圖片載入框架Glide用法

轉載地址: 在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。 它的成功讓我非常感興趣。我花了一整晚的時間把

Android圖片載入框架Glide的簡單用法

一、概述 Glide是一款由Bump Technologies開發的圖片載入框架,可以在android平臺上以很簡單的方式載入和展示圖片。 目前,Glide最新的穩定版本是3.7.0,這個版本的

Android影象處理Paint

enum Paint.Align:設定文字相對於點o(x,y)的位置,有三個選擇CENTER、LEFT、RIGHT,分別表示o在文字的水平中間、o在文字的水平左邊、o在文字的水平右邊 enum Pai

android 圖片處理(擷取,縮放)

有一個任務 顯示一張圖片的中間地方的圖片 1、 什麼也不用設 只要固定了imageView的寬和高 就會自動縮放來填充這個imageview 2、擷取 一張大圖 我要擷取其中的部分 Java程式碼  Bitmap.createBitmap(Bitmap source, in

Android圖片載入框架Glide的基本用法

那麼本篇文章是這個系列的第一篇文章,我們先來了解一下Glide的基本用法吧。 開始 Glide是一款由Bump Technologies開發的圖片載入框架,使得我們可以在Android平臺上以極度簡單的方式載入和展示圖片。 目前,Glide最新的穩定版

python&圖片處理PIL.Image模組(icon圖示)

2.解壓後,進入到目錄下cd /Users/jianan/Downloads/Imaging-1.1.73.python setup.py install  安裝在/Library/Python/2.7

《轉載》Android圖片載入框架Glide用法

在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。它的成功讓我非常感興趣。我花了一整晚的時間把玩,決定分享一些自己的經驗。在開始之前我想說,Glide

Android影象處理圖形特效處理

上一篇部落格說到了Android影象的色彩處理,使用的是ColorMatrix矩陣;本篇部落格說Android圖形的特效處理,使用的是Matrix這個類。 一、Android變形矩陣——Matricx: 跟Android影象的色彩處理基本一樣,只是將ColorMatrix換成了Matrix,ColorMat

圖片載入Glide使用總結

概述 作為Glide是谷歌推薦的圖片載入庫,Glide又著 支援video,Gif,SVG格式,同時有著很好的生命週期管理,支援Volley,OkHttp,更好的記憶體管理策略等優點。 相關方法 with():指定了宣告週期 load():載入資源,