【android】 如何把gif图片下载到本地
以上图片大家可以看到,虽然是个jpg格式的文件,但是本质上是个动图。
但是发现在咱的图片模块下,本地存储的图片只有一帧,问题出在哪里呢?
http获取到的byte[]数据是没问题的
断点跟踪了下,发现问题出现在最后一句压缩图片尺寸的时候。
public static Bitmap getScaledBitMap(byte[] data, int width, int height) { BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(data, 0, data.length, options); float srcWidth = options.outWidth;
float srcHeight = options.outHeight;
int inSampleSize = 1; if (srcHeight > height || srcWidth > width) {
if (srcWidth > srcHeight)
inSampleSize = Math.round(srcHeight / height);
else
inSampleSize = Math.round(srcWidth / width);
} options = new BitmapFactory.Options();
options.inSampleSize = inSampleSize; return BitmapFactory.decodeByteArray(data, 0, data.length, options);
}
最后的解决之道是,不经过Bitmap,直接把http获取到的byte[]数据写入到本地;在取出的时候,才进行图片尺寸压缩。
/**
* 写入bytes
*
* @param url
* @param bytes
* @return
*/
public boolean save(String url, byte[] bytes) {
if (bytes == null || bytes.length == 0)
return false; url = trans2Local(url);
File file = new File(url); if (file.exists())
return true; ZIO.createNewFile(file);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(bytes);
return true;
} catch (Exception e) {
e.printStackTrace();
Log.e("存储出错", e.getMessage());
} finally {
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
这种做法额外的好处是,不再理会奇怪的图片格式质量问题。
比如我们用Bitmap保存图片的时候还要取判断图片类型,还要去指定压缩精度(如果100的话图片尺寸比原图还要大很多,真奇怪)
Bitmap.CompressFormat format = url.toLowerCase().indexOf("png") > 0 ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG;
bitmap.compress(format, 75, fos);
【android】 如何把gif图片下载到本地的更多相关文章
- scrapy框架来爬取壁纸网站并将图片下载到本地文件中
首先需要确定要爬取的内容,所以第一步就应该是要确定要爬的字段: 首先去items中确定要爬的内容 class MeizhuoItem(scrapy.Item): # define the fields ...
- [技术博客]使用wx.downloadfile将图片下载到本地临时存储
目录 目标 代码展示 重点讲解 目标 在上一篇技术博客中,我们生成的海报中包含图片,这些图片是存储到服务器上的,而canvas的drawimage函数只能读取本地文件,因此我们在drawCanvas之 ...
- 前端js保存页面为图片下载到本地
前端js保存页面为图片下载到本地 手机端点击下载按钮将页面保存成图片到本地 前端js保存页面为图片下载到本地的坑 html2canvas 识别 svg 解决方案 方案 html2canvas.js:可 ...
- python 爬虫之requests爬取页面图片的url,并将图片下载到本地
大家好我叫hardy 需求:爬取某个页面,并把该页面的图片下载到本地 思考: img标签一个有多少种类型的src值?四种:1.以http开头的网络链接.2.以“//”开头网络地址.3.以“/”开头绝对 ...
- android开源项目:图片下载缓存库picasso
picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能. picasso有如下特性: 在a ...
- svg保存为图片下载到本地
今天给大家说一个将svg下载到本地图片的方法,这里我不得不吐槽一下,为啥博客园不可以直接上传本地文件给大家用来直接下载分享呢,好,吐槽到此为止! 这里需要用到一个js文件,名字自己起,内容如下: (f ...
- nodejs 将网上的图片下载到本地文件
var request = require('request'); var fs = require('fs'); var img_src = 'https://www.baidu.com/img/b ...
- Android图片下载到本地,系统图库不显示
可能大家都知道我们下载图片到Android手机的时候,然后调用系统图库打开图片,提示"找不到指定项". 那是因为我们插入的图片还没有更新的缘故,所以只要将图片插入系统图库,之后发条 ...
- Android性能优化-减小图片下载大小
原文链接 https://developer.android.com/topic/performance/network-xfer.html 内容概要 理解图片的格式 PNG JPG WebP 如何选 ...
随机推荐
- Sql创建约束
add constraint pk_studentno primary key(StudentNo) //主键 add constraint fk_student_grade_gradeid fore ...
- weX5如何绑定KO对象
define(function(require){ var $ = require("jquery"); var justep = require("$UI/system ...
- D3D HOOK实现透视讲解
实现目的: 目前大部分游戏通过Direct3D实现3D效果,通过挂钩相应函数,可以实现3D透视,屏幕挂字效果.而透视,屏蔽特定效果,设置透明在很多游戏(特别是FPS)中发挥着巨大的作用! 实现思路: ...
- c++11——多线程
c++11中增加了线程以及线程相关的类,很方便的支持了并发编程. 1. 线程 线程创建 使用std::thread创建线程,提供线程函数或者函数对象即可,并且可以指定线程函数的参数. #inc ...
- poj_3628 动态规划
题目大意 有N个数字,大小为a[i], 给定一个数S,用这N个数中的某些数加起来使得结果sum>= S,且sum-S最小,求该最小的sum-S值. 题目分析 题意中可知,这N个数字的和肯定大于S ...
- Python--进阶处理4
#================第四章:迭代器和生成器=================== # 函数 itertools.islice()适用于在迭代器和生成器上做切片操作. import ite ...
- Delphi开发的服务在Windows2003 64位注册方式。
1.在sysWoW32目录下找到cmd.exe,右键运行方式选择administrator,输入密码后.2.TrainServer.exe -install 安装服务.
- Cookies and Session Tracking Client Identification cookie与会话跟踪 客户端识别
w HTTP The Definitive Guide Cookies can be used to track users as they make multiple transactions to ...
- Java8 中的时间和日期 API
1. 日期和时间概述 LocalDate,LocalTime,LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 日历系统 的日期,时间,日期和时间;它们提供了简单的日期 ...
- 剑指Offer——把二叉树打印成多行
题目描述: 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 分析: 二叉树的层次遍历,利用队列. 代码: /* struct TreeNode { int val; struct T ...