Android Bitmap转换WebPng图片导致损坏的分析及解决方案
出现问题的code!!!
private void saveImage(String uri, String savePath) throws IOException {
// 创建连接
HttpURLConnection conn = createConnection(uri);
// 拿到输入流,此流即是图片资源本身
InputStream imputStream = conn.getInputStream();
// 指使Bitmap通过流获取数据
Bitmap bitmap = BitmapFactory.decodeStream(imputStream);
File file = new File(savePath);
OutputStream out = new BufferedOutputStream(new FileOutputStream(file.getCanonicalPath()), BUFFER_SIZE);
// 指使Bitmap以相应的格式,将当前Bitmap中的图片数据保存到文件
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
out.close();
}
}
上述代码的原理就是读取网络上一张图片,先使用google API转换成bitmap,然后在转换成png到本地。
一般情况下这个方法是没有任何问题的,但是有时候在一些手机上表现却是不辣么乐观,表现为图片黑边,或者说是显示的不完整,再者说就是丢失数据!!!
这个问题的根本凶手就是底层rom算法的问题,不需要自己过多的考虑,由于咱们不可能要求手机厂商为咱们修改什么,在这说厂商修改了这个问题,用户也不一定能更新到,所以这样的问题还是需要想办法去克服,去修改!!!
这里直接上代码,修改code如下:
private void saveImage(String uri, String savePath) throws IOException {
// 创建连接
HttpURLConnection conn = createConnection(uri);
// 拿到输入流,此流即是图片资源本身
InputStream imputStream = conn.getInputStream();
// 将所有InputStream写到byte数组当中
byte[] targetData = null;
byte[] bytePart = new byte[4096];
while (true) {
int readLength = imputStream.read(bytePart);
if (readLength == -1) {
break;
} else {
byte[] temp = new byte[readLength + (targetData == null ? 0 : targetData.length)];
if (targetData != null) {
System.arraycopy(targetData, 0, temp, 0, targetData.length);
System.arraycopy(bytePart, 0, temp, targetData.length, readLength);
} else {
System.arraycopy(bytePart, 0, temp, 0, readLength);
}
targetData = temp;
}
}
// 指使Bitmap通过byte数组获取数据
Bitmap bitmap = BitmapFactory.decodeByteArray(targetData, 0, targetData.length);
File file = new File(savePath);
OutputStream out = new BufferedOutputStream(new FileOutputStream(file.getCanonicalPath()), BUFFER_SIZE);
// 指使Bitmap以相应的格式,将当前Bitmap中的图片数据保存到文件
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
out.close();
}
}
哈哈 其实大家看到这个code 484就笑了,换汤不换药啊,这里直接就是换了个API,稍微不同的是这里传入了byteArray!!!不管咋地这个解法暂时还没遇到上述问题!!!
对了,我在看这个关于图片显示不完整的问题的时候,了解的一点小知识点吧算是给大家分享下,大家可以随便找个.png图片看下他的HEX(十六进制),png图片都是以IHDR开头,以IEND结尾的,不然的是无法显示的,上述问题黑边的但是能显示只是中间的一些像素丢失了。So END !!!
Android Bitmap转换WebPng图片导致损坏的分析及解决方案的更多相关文章
- Android Bitmap转换WebP图片导致损坏的分析及解决方案
背景 作为移动领域所力推的图片格式,WebP图片在商业领域证明了其应有的价值.基于其他格式的横向对比,其在压缩性能表现,及还原度极为优秀,节省大量的带宽开销.基于可观的效益比,团队早前已开始磋商将当前 ...
- Android View转换成图片保存
package zhangphil.viewtoimage; import java.io.File;import java.io.FileOutputStream; import android.o ...
- android bitmap compress(图片压缩)
android bitmap compress android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片. 有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么 ...
- Android Bitmap 和 ByteArray的互相转换
Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...
- 【Android】Bitmap加载图片错误 java.lang.OutOfMemoryError: bitmap size exceeds VM budget
今天测试程序的时候出现下面的错误日志信息,程序当场挂掉 07-09 14:11:25.434: W/System.err(4890): java.lang.OutOfMemoryError: bitm ...
- Android bitmap图片处理
一.View转换为Bitmap 在Android中所有的控件都是View的直接子类或者间接子类,通过它们可以组成丰富的UI界面.在窗口显示的时候Android会把这些控件都加载到内存中 ...
- Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】
package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...
- Android,View转换bitmap,bitmap转换drawable
Android View转换Bitmap,Bitmap转换Drawable //测试设置bitmap View view1 = ViewGroup.inflate(context, R.layout. ...
- 【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)
一.背景 最近想把一些Android Demo的运行效果图获取下来,但是一直使用真机进行调试,在电脑上不好截取一段gif动画.而之前使用模拟器的时候可以使用 GifCam 工具进行屏幕动画截取.Gif ...
随机推荐
- 转载:持续集成之解决jenkins内存溢出问题
在jenkins master-slave配置中,总是出现内存溢出问题,更换了机器设备仍然跑不起来: 问题如下: Status Code: 500 Exception: org.apache.c ...
- BZOJ4643 : 卡常大水题
将边按权值$A$从小到大排序,从小到大枚举$\max(A)$,然后双指针从大到小枚举$\max(B)$. 按权值$B$用大根堆维护所有已经加入的边,每次$\max(B)$减少时,不断取出权值$B$最大 ...
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
- js模块化方案【转】
(function(){ var CENTER = new EvtCenter(); var Loaded={}; var Modules={}; function loadScript(name,u ...
- Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- antlr.collections.AST.getLine()I异常
antlr.collections.AST.getLine()I异常 Struts+hibernate+spring项目经常遇到问题 因为Struts自带的antlr-2.7.2.jar,比H ...
- 手动编译安装LNMP
yum -y install gcc gcc-c++ autoconf nss_ldap libjpeg libjpeg-devel libpng libpng-devel freetype free ...
- 微博mid和id转换
mid为62进制编码,id为常见的10进制编码. id从低位到高位,7个数字为一组,转换为62进制,并顺序合并,即转换为mid. mid从地位到高位,4个字母为一组,转换为10进制,并右移7位,计算和 ...
- oracle数据库使用三个月的总结
存储过程定义,举个例子如下: create or replace procedure test_person(id in Number, Ename In Varchar2, age In Varch ...
- selenium python的使用(一)
下面是一个爬取知网数据的例子,使用selenium 用python爬取数据 1.创建对象,打开指定地址,在休眠的20秒内输入搜索项 driver= webdriver.Chrome() driver. ...