两种方式, 推荐方式一

方式一 downloadOnly

创建一个 ImageActivity

public class ImageActivity extends AppCompatActivity {

    private static final String TAG = "ImageActivity";

    private ImageView iv;

    Bitmap bitmap;

    private String mUrl;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image); iv = (ImageView) findViewById(R.id.iv); // 图片的url 从另一个Activity传过来
String url = getIntent().getStringExtra(EXTRA_URL);
mUrl = url; loadImage(url); // 长按 ImageView 把图片保存到手机 iv.setOnLongClickListener(new View.OnLongClickListener(){
@Override
public boolean onLongClick(View v) { download(mUrl)
return true;
}
});
} // 加载并显示图片
public void loadImage(String url) {
Glide.with(this).load(url).placeholder(R.drawable.image_loading)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.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) {
Log.d(TAG, "onResourceReady: mode: " + model); // 如果return true; 则 into(iv) 不起作用, 要手动设置图片
// iv.setImageDrawable(resource); return false;
}
})
.into(iv);
} // 保存图片到手机
public void download(final String url) { new AsyncTask<Void, Integer, File>() { @Override
protected File doInBackground(Void... params) {
File file = null;
try {
FutureTarget<File> future = Glide
.with(ImageActivity.this)
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); file = future.get(); // 首先保存图片
File pictureFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsoluteFile(); File appDir = new File(pictureFolder ,"Beauty");
if (!appDir.exists()) {
appDir.mkdirs();
}
String fileName = System.currentTimeMillis() + ".jpg";
File destFile = new File(appDir, fileName); FileUtil.copy(file, destFile); // 最后通知图库更新
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File(destFile.getPath())))); } catch (Exception e) {
Log.e(TAG, e.getMessage());
}
return file;
} @Override
protected void onPostExecute(File file) { Toast.makeText(ImageActivity.this, "saved in Pictures/GankBeauty", Toast.LENGTH_SHORT).show();
} @Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}.execute();
}
}

以上代码 从另一个activity得到 图片的 url , 然后使用Glide 图片加载库 将图片显示到 ImageView上, 长按ImageView可以将图片保存到手机的 Pictures/Beauty 目录中

这是基本的代码模板, 实际情况更复杂,比如Android 6 还有运行时申请存储权限的问题。

方式二 asBitmap  bitmap.compress

还有一种保存图片的方式也有很多人用,但是经过我对比发现并不好,推荐上面的方式。另一种方式的代码如下

把上面 loadImage 换成 下面的 loadBitmap

    public void loadBitmap(String url) {
Glide.with(this).load(url).asBitmap().placeholder(R.drawable.image_loading)
.listener(new RequestListener<String, Bitmap>() {
@Override
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
return false;
} @Override
public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) { Log.i(TAG, "onResourceReady: thread is " + Thread.currentThread().getName());
isReady = true;
bitmap = resource;
iv.setImageBitmap(resource); return false;
}
})
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); }

把上面的 download 换成下面的 saveImage

public void saveImage() {

        // 首先保存图片
File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsoluteFile(); File appDir = new File(file ,"Beauty");
boolean createed = false;
if (!appDir.exists()) {
createed = appDir.mkdirs();
}
String fileName = System.currentTimeMillis() + ".jpg";
File currentFile = new File(appDir, fileName); FileOutputStream fos = null;
try {
fos = new FileOutputStream(currentFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} // 最后通知图库更新
this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File(currentFile.getPath())))); }

这种方式把图片变成bitmap , 保存的时候又重新压缩bitmap 保存到手机。

总结

从电脑下载图片,然后与保存到手机的图片对比,发现bitmap的方式得到的图片体积变大。

而第一种方式下载的图片与从电脑上下载的图片体积一致,md5一致。

所以推荐downloadOnly方式

 

作者:Panda Fang

出处:http://www.cnblogs.com/lonkiss/p/7119062.html

原创文章,转载请注明作者和出处,未经允许不可用于商业营利活动

Glide实现查看图片和保存图片到手机的更多相关文章

  1. 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)

    在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”, ...

  2. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  3. Glide加载图片问题记录

    Glide加载图片相比于Picasso而言性能较好,又比Fresco轻巧,而且又支持加载gif动图,是Google 推荐.专注平滑的滚动.简单易用.可扩展的一款图片加载框架.但是使用时还是会遇到一些问 ...

  4. 微信小程序例子-保存图片到手机相册

    微信小程序例子-保存图片到手机相册 1.关键代码 1)WXML文件 2)JS文件 saveImgToPhotosAlbumTap: function(){ // 图片必须是 https 的 var I ...

  5. 【jQuery小实例】js 插件 查看图片

    ---本系列文章所用使用js均可在本博客文件中找到. 像淘宝一样,鼠标放在某一件商品上,展示大图信息,甚至查看图片的具体部位.给人超炫的效果,这种效果实现基于js文件和js插件.大致可以分为三步,添加 ...

  6. Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果

     Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...

  7. ReactNative学习-滑动查看图片第三方组件react-native-swiper

    滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方 ...

  8. RoundedImageView使用吐槽心得(RoundedImageView与Glide加载图片,第一次加载无法圆角问题)

    最近使用的时候发现一个问题, RoundedImageView与Glide搭配使用的时候,第一次加载图片(内存中没有),后图片无法圆角,后来尝试各种改,最后想到了一个办法,就是让Glide加载图片的 ...

  9. Vue 封装可向左向右查看图片列表的组件

    <template> <div class="content-container"> <div class="content-contain ...

随机推荐

  1. 基于vue-cli li列表的显示隐藏

    效果:点击“公告标题”,显示公告内容,点击同一个“公告标题”多次,显示与隐藏切换 方法一: html部分代码: <ul class="clist"> <li v- ...

  2. 简易APB4 slave实践

    一个简易的(不完整的)APB4 slave的可以没有PREADY和PSLVERR,这两个信号都被赋予常数,以及没有PPROT. 两种不同类型的寄存器: 图: 普通寄存器电路图 图: 带读写控制寄存器电 ...

  3. 转-阿里云Kubernetes容器Istio实践之集成日志

    http://cloud.it168.com/a2018/0801/3216/000003216642.shtml#articlecomment https://mbd.baidu.com/newsp ...

  4. js中自执行函数写法

    //自执行写法1 (function T(){ alert(1) })() //自执行写法2 var T1=function(){ alert(1) }(); //传值 var para1={a:1; ...

  5. opencv_python使用cv2.imread()读取中文路径报错问题(转)

    原地址:https://blog.csdn.net/liuqinshouss/article/details/78696032 1 说明 本篇中使用的opencv版本为3.3,python使用的版本为 ...

  6. 实现微信小程序支付

    1.在小程序中获取用户的登录信息,成功后可以获取到用户的code值 2.把code值传给服务端,服务端请求微信获取用户openid接口,成功后可以获取用户的openid值 3.服务器上面请求微信的统一 ...

  7. Revit二次开发_快速显示隐藏剖面框

    最近遇到一种状况需要经常切换剖面框的可见性,于是想将剖面框的显示与隐藏做成一个按钮,方便切换. 其他类似元素想做成快速切换可见性应该可以使用类似做法. 这次的隐藏对象是剖面框,所以我直接就隐藏元素了. ...

  8. (转)MySQL- 5.7 sys schema笔记,mysql-schema

    原文:http://www.bkjia.com/Mysql/1222405.html http://www.ywnds.com/?p=5045 performance_schema提供监控策略及大量监 ...

  9. python 冒泡和快排,不多说

    #-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...

  10. c# 实现RPC框架的思路

    RPC框架,就是远程调用一个方法就像是本地调用一样. 用于网络消息的话,那么你的收发消息通过异步方法可以写在一起,很方便 核心代码 using System; using System.Collect ...