<?php
$file = isset($_GET['file']) ? $_GET['file'] : '';
$w = isset($_GET['w']) ? $_GET['w'] : '200';
$h = isset($_GET['h']) ? $_GET['h'] : '100';
$xossprocess = isset($_GET['x-oss-process']) ? $_GET['x-oss-process'] : '';
$disposeUpload = './tmp/';
$file = './' . $file;
if (!is_file($file)) {
    header('HTTP/1.1 404 Not Found');
    exit;
}
//如果没有参数
if (empty($xossprocess)) {
    out($file);
    exit;
} else {
    $oss = explode(',', $xossprocess);
    $h = str_replace('h_', '', $oss[2]);
    $w = str_replace('w_', '', $oss[3]);
    if (!is_numeric($h) || !is_numeric($w)) {
        header('HTTP/1.1 404 Not Found');
        exit;
    }
}
$fileArray = pathinfo($file);
$filename = md5($file . $w . $h);
$disposeUpload = $disposeUpload . $filename . '.' . $fileArray['extension'];
//如果存在就直接发送
if (is_file($disposeUpload)) {
    out($disposeUpload);
    exit;
}
$extension = strtolower($fileArray['extension']);
if (!in_array($extension, ['png', 'jpg', 'jpeg', 'gif'])) {
    header('HTTP/1.1 404 Not Found');
    exit;
}
disposeResize($file, $disposeUpload, $w, $h);
out($disposeUpload);
exit;
function out($imgsrc)
{
    $info = getimagesize($imgsrc);
    $imgdata = fread(fopen($imgsrc, 'rb'), filesize($imgsrc));
    header("content-type:{$info['mime']}");
    echo $imgdata;
}
function disposeResize($file, $newfile, $w, $h)
{
    $cmd = " convert -resize {$w}x{$h}! {$file} {$newfile}";
    system($cmd, $r);
    if ($r == 0) {
        return true;
    } else {
        return false;
    }
}

使用OkHttp实现从Https中加图片

工具类:OkHttpUrlLoader、OkHttpStreamFetcher

glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(httpsOkHttpClient));

5.3 和ImageViewscaleType的关系

由于ImageView的展示还需要受android:scaleType的影响,这里情况有很多,所以上面裁剪出来,并不是说在ImageView里面展示就是20 * 20,具体会出现的情况很多,这个之后再专门分析。

3 .fallback()

设置model为空时显示的Drawable。

文章由爱资料原创本文地址:

简介

  • ViewTarget可用于自定义 View
  • ViewTargetSimpleTarget的区别是ViewTarget内部含有 View

6.3 两种策略的关系

上面我们讨论了两种缓存策略的定义,这两种策略是相互独立的,默认情况下内存的缓存为打开,而磁盘的缓存策略为DiskCacheStrategy.ALL

13 Glide播放本地视频

Glide.with(this).load(Uri.fromFile(new File(filePath))).into(imageView);
注意:Glide只可播放本地视频文件,不可播放网络文件。

本篇文章就记录这些Glide的基础使用,下一篇记录它的更多功能。

Android之Bitmap请移步
star
Github

图片 1

其实原理还是利用传上来w
、h参数,自动裁剪图片大小尺寸,并且将文件缓存起来防止重复裁剪!

前言

在写本教程时, Glide 的版本号是3.7。

5.1 裁剪

Picasso相比,Glide提供了一种更加高效的处理方式,它会把内存和缓存中的图片限制到所展示的ImageView的返回内,Picasso也可以实现这一功能,但是需要调用fit()方法。在使用Glide时,如果我们不希望它自动地去匹配ImageView的宽高,那么可以调用override(width, height),这样图片资源在被展示之前就会裁剪为指定的大小。

这个方法还有另一种场景,就是当我们确切的知道需要加载多大的图片,但是此时ImageView的宽高并没有得到。

5 .diskCacheStrategy()

在说这个方法前,了解下Glide磁盘缓存策略,Glide的磁盘缓存策略很高大上,同一个URL它可能会缓存多份图像,为什么这么说呢,举个列子:
你要加载的图片原始大小是100×100,可是ImageView的大小是50×50,
Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中,帮助我们节省内存开支,我们也就完全不用担心图片内存浪费,甚至是内存溢出的问题。
这个时候Glide即会缓存原始图像,也会缓存转换后的图像
所以我们可以用这个方法来设置磁盘缓存策略,此方法的参数给定了四个值:

图片 2

  • DiskCacheStrategy.ALL 缓存所有版本图片,这是Glide默认磁盘缓存策略
  • DiskCacheStrategy.NONE 不缓存
  • DiskCacheStrategy.SOURCE 缓存原始图片
  • DiskCacheStrategy.RESULT
    缓存最终图像,也就是根据ImageView大小转换后的图片

Glide.with(this).load(url).diskCacheStrategy(DiskCacheStrategy.RESULT).into(imageView);
另外,Glide提供了清空磁盘缓存的方法,这个方法却必须在后台线程中调用:
Glide.get(getApplicationContext()).clearDiskCache();

新建如下php文件,使用convert来进行处理缩略图到tmp临时目录缓存。

多个转换

Glide.with(this).load(R.drawable.demo)
        .bitmapTransform(new BlurTransformation(context, 25), new CropCircleTransformation(context))
        .into((ImageView) findViewById(R.id.image));

5.2 asBitmap()

现在讨论另外一种情况,在列表当中,虽然我们获得的是Gif链接,但是我们希望这时候不让它播放,这时候就可以指定asBitmap(),那么就只会展示Gif图片的第一帧。

6 .override()

虽然说Glide会自动判断ImageView的大小去加载相应的图片,但是不排除某些情况下我们需要去指定加载的大小,此时就用这个方法
Glide.with(this).load(url).override(200,200).into(imageView);
注意,单位是像素,我们需要自己去计算

请求参数可以自定义为其他

简介

  • 相关网址:GitHub地址、英文文档。
  • Glide
    是一个媒体管理框架,支持图片、原生视频的加载,包括从网络上加载。

4.3 定义图片切换动画

无论是placeHolder还是error,都会涉及到切换ImageView的图片,这时我们可以通过设置一个动画来让这个切换的过程显得不那么突兀,默认情况下动画是开启的,crossFade有下面这三个重载方法:

  • crossFade():采用默认动画和默认时长。
  • crossFade(int duration):采用默认动画,自定义时长。
  • crossFade(int animationId, int duration):采用自定义动画,并自定义时长。

    public void loadCustomCrossFade(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .placeholder(R.drawable.book_placeholder)
                .crossFade(5000) //改变的时长.
                .into(mImageView);
    }
12 Gif的加载

Glide一个牛叉的功能就是允许我们去加载Gif格式的图片,而且还非常简单和加载静态图一样,不需要特殊的处理。如下,只要你传人一个gif的URL即可,Glide会自动去识别它是不是Gif;
Glide.with(this).load(gifUrl).into(imageView);

  • .asBitmap()
    无论你传入的URL对应的是不是一个Gif,Glide都会把它当做静态图,这时的静态图会停留在Gif的第一帧
  • .asGif()
    无论你传入的URL对应的是不是一个Gif,Glide都会把它当做Gif来处理,如果不是,Glide会回调.error()方法
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="zip" stopProcessing="true">
                    <match url="^(uploads/.*jpg|uploads/.*jpeg|uploads/.*png|uploads/.*gif)$" />
                    <action type="Rewrite" url="/test.php?file={R:1}" />
                    <conditions>
                    </conditions>
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

简单的缩略图加载

  • 简单的 缩略图 是和 原图 一起加载的。

.thumbnail(0.1f)

三、load的其它用法

在第二章的例子当中,当我们调用完.with(Context context)之后,会返回一个RequestManager对象,之前我们就是调用它的load(String string)方法,除此之外,还提供了下面的这些load方法,load方法最终会返回一个DrawableTypeRequest<xxxx>,而xxx就是我们传入的参数的类型:

图片 3

  • load(byte[] model),从byte[]中读取
  • load(File file),从File中读取
  • load(Integer resourceId),从resourceId中读取
  • load(String string),从String当中读取,这个一般对应于网络图片的链接,这个图片有可能是普通的图片,也可能是一个Gif,当我们需要展示一个Gif图片时,只需要像加载普通图片一样就可以了,在加载完之后,这个Gif会被自动播放。
  • load(T model),从任意类型T的中读取,这个后面讲到自定义Model时再介绍
  • load(Uri uri),从Uri类型中读取,这个Uri必须能够被UriLoader识别。
  • loadFromMediaStore(Uri uri),从媒体设备的Uri中读取,这个方法用来展示一个本地媒体视频的缩略图,也就是视频的第一帧,需要注意,这个链接只能是本地的,网络上视频链接地址是无效的。

下面是各个方法加载的例子:

    //从byte[]中加载.
    public void loadByteArray(View view) {
        Bitmap sourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.book_local);
        ByteArrayOutputStream bArrayOS = new ByteArrayOutputStream();
        sourceBitmap.compress(Bitmap.CompressFormat.PNG, 100, bArrayOS);
        sourceBitmap.recycle();
        byte[] byteArray = bArrayOS.toByteArray();
        try {
            bArrayOS.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Glide.with(this)
                .load(byteArray)
                .into(mImageView);
    }
    //从File中加载.
    public void loadFile(View view) {
        String storePath = "mnt/sdcard/book_local.jpg";
        File file = new File(storePath);
        Glide.with(this)
                .load(file)
                .into(mImageView);
    }
    //从resourceId中加载.
    public void loadResourceId(View view) {
        Glide.with(this)
                .load(R.drawable.book_local)
                .into(mImageView);
    }
    //从普通url中加载.
    public void loadNormalUrl(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .into(mImageView);
    }
    //从gif加载.
    public void loadGif(View view) {
        Glide.with(this)
                .load("http://s1.dwstatic.com/group1/M00/66/4D/d52ff9b0727dfd0133a52de627e39d2a.gif")
                .diskCacheStrategy(DiskCacheStrategy.SOURCE) //要加上这句,否则有可能会出现加载很慢,或者加载不出来的情况.
                .into(mImageView);
    }
    //从本地媒体视频中加载.
    public void loadMedia(View view) {
        String storePath = "mnt/sdcard/media.mp4";
        File file = new File(storePath);
        Glide.with(this)
                .load(Uri.fromFile(file))
                .into(mImageView);
    }
4 .skipMemoryCache()

跳过内存缓存,也就是说加载的图片不会缓存到内存中,且它并不会影响到磁盘缓存策略。
如果不调用此方法Glide默认会缓存到内存中去,所以我们没必要调用.skipMemoryCache(false);
Glide.with(this).load(gifUrl).skipMemoryCache(true).into(imageView);
另外,Glide也提供了清除内存缓存的方法:
Glide.get(context).clearMemory();
注意,这个方法只能在UI线程中调用,否则会报错:

图片 4

重写registerComponents()

8.2 Complete Different Request

thumbnails还支持传入一个Glide Request作为参数,这个请求和原本的请求是相互独立的,我们可以给它指定一个完全不同的url、缓存策略、大小等等。

    public void loadRequestThumbnail(View view) {
        DrawableRequestBuilder<String> thumbnailRequest = Glide
                .with(this)
                .load("http://i.imgur.com/DvpvklR.png");
        Glide.with(this)
                .load("http://s1.dwstatic.com/group1/M00/66/4D/d52ff9b0727dfd0133a52de627e39d2a.gif")
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .thumbnail(thumbnailRequest)
                .into(mImageView);
    }
9 .priority()

设置请求的优先级,此方法给定了如下几个可选值,它们的优先级依次递减:

图片 5

Glide.with(this).load(url).priority(Priority.HIGH).into(imageView);

iis下伪静态规则:

1. 创建RequestListener

RequestListener<String, GlideDrawable> errorListener = new RequestListener<String, GlideDrawable>() {
    @Override
    public boolean onException(Exception e, String model, Target<GlideDrawable> target,
                               boolean isFirstResource) {
        Log.e("onException", e.toString() + "  model:" + model + " isFirstResource: " + isFirstResource);
        imageView.setImageResource(R.mipmap.ic_launcher);
        return false;
    }

    @Override
    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,
                                   boolean isFromMemoryCache, boolean isFirstResource) {
        Log.e("onResourceReady", "isFromMemoryCache:" + isFromMemoryCache + "  model:" + model
                + " isFirstResource: " + isFirstResource);
        return false;
    }
};

二、导入依赖包&加载网络静态图片

在使用前,首先需要在build.gradle中引入:

dependencies {
    //....
    compile 'com.github.bumptech.glide:glide:3.7.0'
    //...
}

下面是Glide加载一张网络静态图片最基本的用法:

Glide
.with(this) //传入关联的Context,如果是Activity/Fragment,那么它会根据组件当前的状态来控制请求。
.load("http://i.imgur.com/DvpvklR.png") //需要加载的图片,大多数情况下就是网络图片的链接。
.into(getImageView()); //用来展现图片的ImageView.
1 .placeholder()

占位图,也就是从开始加载到加载结束这段时间内显示的默认图片;
两个重载方法placeholder( int resourceId)placeholder(Drawable drawable)placeholder( int resourceId)方法也可以用颜色来作为占位图;

Glide.with(this).load(url).placeholder(R.mipmap.loading).into(imageView);
Glide.with(this).load(url).placeholder(R.color.colorAccent).into(imageView);

如下在window中使用伪静态处理缩略图,很多地方都需要缩略图。但是生成出来很占位置,oss的确不错选择。但是流量大了oss烧的慌。

重写applyOptions()

一、概述

本文的内容大部分都是参考了下面这个链接中Glide分类的文章:

https://futurestud.io/tutorials/glide-getting-started

为了区分,我们这篇只介绍一些基本用法,掌握这些基本就可以在项目中使用Glide了,而关于如何自定义Target/Glide Module等高级的用法,之后再进行讨论。

.with()方法

图片 6

  • 可以看到Glide的with方法接受的参数有:Context、Activity、Fragment、FragmentActivity;Glide会自动从Activity、Fragment、FragmentActivity中获取它们的Context‘;
  • 我们还可以用getApplicationContext()方法获取全局Context,当你在Activity生命周期之外获取图片时就可以用这个方法。
  • 接受Activity、Fragment、FragmentActivity作为这个方法的参数有一个好处就是会使图片加载会和Activity、Fragment、FragmentActivity的生命周期绑定在一起。

请求方法:

简单示例

5.3 定义缓存

如果我们使用了.diskCacheStrategy(DiskCacheStrategy.SOURCE),那么Gif资源的加载将会更快。

8 .thumbnail()

缩略图,先加载缩略图 然后在加载全图,可用于加载中显示的图片
Glide.with(this).load(url).thumbnail(0.1f).into(imageView);
当然,还可以加载一个其他URL的图片作为缩略图

DrawableRequestBuilder<String> thumbnailRequest = Glide.with(this).load(thumbUrl);
Glide.with(this).load(url).thumbnail(thumbnailRequest).into(imageView);

缓存失效【Todo】

官方教程

6.2 磁盘缓存策略

当某个图片变化很快时,我们有可能不需要将它缓存到磁盘当中,我们可以采用diskCacheStrategy(int mode)来定义缓存的策略,Glide默认情况下既会缓存原始的图片,也会缓存解析后的图片,举个例子,假如服务器上的图片是1000 * 1000,而ImageView的大小只有500 * 500,默认情况下Glide会缓存这两个版本的图片,我们可以设定的磁盘缓存类型有下面四种:

  • DiskCacheStrategy.NONE:不缓存
  • DiskCacheStrategy.SOURCE:只缓存原始大小的图片,也就是1000 * 1000
  • DiskCacheStrategy.RESULT:只缓存解析之后的图片,也就是上面500 * 500的图片,也就是说假如我们有两个不同大小的ImageView,用他们加载同一个url的图片,那么最终磁盘当中会有两份不同大小的图片资源。
  • DiskCacheStrategy.ALL:缓存所有版本的图片。

现在我们介绍一下采用了DiskCacheStrategy.RESULT后的缓存文件名的命名策略,具体可以参考下面这篇文章:

https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation

缓存文件的命名会依赖于四个部分:

  • DataFechergetId()方法的返回值,一般情况下就是Data ModeltoString方法。对于传入String类型的网络链接而言,就是url,而如果是File,那么就是Filepath
  • 目标的宽高,如果定义了override(width, height),那就是指定的数值,默认情况下是TargetgetSize()方法,也就是ImageView的宽高。
  • 用来加载和缓存图片的encodersdecoderstoString方法。
  • 在加载时的可选签名,这个方法在某些特殊的场景下很有用,例如加载的url没有变,但是服务器上这个url对应的图片资源更新了,我们就可以通过.signature(xxx)来刷新缓存。
11 .listener()

监听请求状态,此方法需要一个RequestListener类型参数,有两个回调方法;
onException返回true表示我们自己处理掉了异常,false表示交给Glide去处理;方法最好返回false,这样的话Glide会自动回调.error();
onResourceReady返回true表示用户自己已经设置好资源,包括截取操作,动画操作之类的,准备好显示;false表示交给Glide。

Glide.with(this)
.load(url)
.listener(new RequestListener<String, GlideDrawable>() {
  @Override
  public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
    return false;
  }
  @Override
  public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
    return false;
  }
})
.error(R.mipmap.error)
.into(imageView);

这种匿名类写法每次都会创建新的监听器,造成了不必要的内存申请和引用,我们可以创建一个公共的监听器来统一处理。

简介

  • 缩略图 :在图片加载过程中显示的图片。

8.1 Simple Thumbnails

    public void loadScaleThumbnail(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .thumbnail(0.1f)
                .into(mImageView);
    }

.load()方法

图片 7

这个方法的参数告诉我们Glide允许我们加载不同途径的图片

  1. load(String string) 从网络加载
    实际上它的参数可以为一个文件路径、uri或者url

Glide.with(this).load(url).into(imageView); 或
String path = "file://"+ Environment.getExternalStorageDirectory().getPath()+"/mypic.jpg";
Glide.with(this).load(path).into(imageView);
  1. load(File file) 从文件加载
    Glide.with(this).load(file).into(imageView);
  2. load(Integer resourceId) 从Resource中加载
    Glide.with(this).load(R.mipmap.ic_launcher).into(imageView);
  3. load(Uri uri) 从Uri获取

Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.mipmap.ic_launcher);
Glide.with(this).load(uri).into(imageView);

这是从资源文件中生成的Uri,实际上可以是任何Uri

  1. load(byte[] model)

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.error);
byte[] model = Bitmap2Bytes(bmp);
Glide.with(this).load(model).into(imageView);

public byte[] Bitmap2Bytes(Bitmap bm) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();
}

1. 创建SimpleTarget

SimpleTarget target = new SimpleTarget<Bitmap>(/* 长 */, /* 宽 */) {
    @Override
    public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
        // 获取到bitmap
        imageView1.setImageBitmap(bitmap);
    }
};

6.1 内存缓存策略

默认情况下,Glide会将图片资源缓存到内存当中。而如果使用了skipMemoryCache(true)Glide不会将这张图片缓存到内存当中。
有一点需要注意:如果之前对某个指向url的图片使用了内存缓存,后面又用skipMemoryCache(true)声明想让同一个url不缓存到内存中,那么是不会生效的。

7 .CenterCrop() & .fitCenter()

这两个方法和ImageView的android:scaleType="centerCrop | fitCenter"的意义类似;
CenterCrop()缩放图像让它填充到 ImageView
界限内并且裁剪额外的部分,ImageView
可能会完全填充,但图像可能不会完整显示。
fitCenter()缩放图像让图像测量出来等于或小于 ImageView
的边界范围。该图像将会完全显示,但可能不会填满整个 ImageView。
Glide.with(this).load(url).fitCenter().into(imageView);

简介

  • RequestListener.onException(...):资源加载出错时调用。
  • RequestListener.onResourceReady(...):资源加载完成时调用。

4.1 显示占位图片

有时候由于网络原因,导致请求耗时,此时就需要在得到图片资源之前,采用一个占位图片,这样就不会显得界面太空,placeHolder就是做这个事的,当我们调用了into方法之后,如果需要从网络上获取图片,那么它会先展示placeHolder设置的图片,placeHolder除了支持传入resourceId,还支持直接传入一个Drawable对象。

    @Override
    public DrawableRequestBuilder<ModelType> placeholder(int resourceId) {
        super.placeholder(resourceId);
        return this;
    }
    @Override
    public DrawableRequestBuilder<ModelType> placeholder(Drawable drawable) {
        super.placeholder(drawable);
        return this;
    }

使用placeHolder的例子:

    public void loadHolder(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .placeholder(R.drawable.book_placeholder)
                .into(mImageView);
    }

DrawableTypeRequest

.load()方法返回一个DrawableTypeRequest对象,DrawableTypeRequest的类继承关系如下:
public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<ModelType> implements DownloadOptions
接下来就看看在load()方法后还有哪些public方法供我们在加载时使用

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注