出现问题的code!!!

  1. private void saveImage(String uri, String savePath) throws IOException {
  2.  
  3. // 创建连接
  4. HttpURLConnection conn = createConnection(uri);
  5.  
  6. // 拿到输入流,此流即是图片资源本身
  7. InputStream imputStream = conn.getInputStream();
  8.  
  9. // 指使Bitmap通过流获取数据
  10. Bitmap bitmap = BitmapFactory.decodeStream(imputStream);
  11.  
  12. File file = new File(savePath);
  13.  
  14. OutputStream out = new BufferedOutputStream(new FileOutputStream(file.getCanonicalPath()), BUFFER_SIZE);
  15.  
  16. // 指使Bitmap以相应的格式,将当前Bitmap中的图片数据保存到文件
  17. if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
  18. out.flush();
  19. out.close();
  20. }
  21. }

  上述代码的原理就是读取网络上一张图片,先使用google API转换成bitmap,然后在转换成png到本地。

  一般情况下这个方法是没有任何问题的,但是有时候在一些手机上表现却是不辣么乐观,表现为图片黑边,或者说是显示的不完整,再者说就是丢失数据!!!

   这个问题的根本凶手就是底层rom算法的问题,不需要自己过多的考虑,由于咱们不可能要求手机厂商为咱们修改什么,在这说厂商修改了这个问题,用户也不一定能更新到,所以这样的问题还是需要想办法去克服,去修改!!!

  这里直接上代码,修改code如下:

  1. private void saveImage(String uri, String savePath) throws IOException {
  2.  
  3. // 创建连接
  4. HttpURLConnection conn = createConnection(uri);
  5.  
  6. // 拿到输入流,此流即是图片资源本身
  7. InputStream imputStream = conn.getInputStream();
  8.  
  9. // 将所有InputStream写到byte数组当中
  10. byte[] targetData = null;
  11. byte[] bytePart = new byte[4096];
  12. while (true) {
  13. int readLength = imputStream.read(bytePart);
  14. if (readLength == -1) {
  15. break;
  16. } else {
  17. byte[] temp = new byte[readLength + (targetData == null ? 0 : targetData.length)];
  18. if (targetData != null) {
  19. System.arraycopy(targetData, 0, temp, 0, targetData.length);
  20. System.arraycopy(bytePart, 0, temp, targetData.length, readLength);
  21. } else {
  22. System.arraycopy(bytePart, 0, temp, 0, readLength);
  23. }
  24. targetData = temp;
  25. }
  26. }
  27.  
  28. // 指使Bitmap通过byte数组获取数据
  29. Bitmap bitmap = BitmapFactory.decodeByteArray(targetData, 0, targetData.length);
  30.  
  31. File file = new File(savePath);
  32.  
  33. OutputStream out = new BufferedOutputStream(new FileOutputStream(file.getCanonicalPath()), BUFFER_SIZE);
  34.  
  35. // 指使Bitmap以相应的格式,将当前Bitmap中的图片数据保存到文件
  36. if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
  37. out.flush();
  38. out.close();
  39. }
  40. }

  哈哈  其实大家看到这个code 484就笑了,换汤不换药啊,这里直接就是换了个API,稍微不同的是这里传入了byteArray!!!不管咋地这个解法暂时还没遇到上述问题!!!

  对了,我在看这个关于图片显示不完整的问题的时候,了解的一点小知识点吧算是给大家分享下,大家可以随便找个.png图片看下他的HEX(十六进制),png图片都是以IHDR开头,以IEND结尾的,不然的是无法显示的,上述问题黑边的但是能显示只是中间的一些像素丢失了。So END !!!

Android Bitmap转换WebPng图片导致损坏的分析及解决方案的更多相关文章

  1. Android Bitmap转换WebP图片导致损坏的分析及解决方案

    背景 作为移动领域所力推的图片格式,WebP图片在商业领域证明了其应有的价值.基于其他格式的横向对比,其在压缩性能表现,及还原度极为优秀,节省大量的带宽开销.基于可观的效益比,团队早前已开始磋商将当前 ...

  2. Android View转换成图片保存

    package zhangphil.viewtoimage; import java.io.File;import java.io.FileOutputStream; import android.o ...

  3. android bitmap compress(图片压缩)

    android bitmap compress android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片. 有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么 ...

  4. Android Bitmap 和 ByteArray的互相转换

    Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...

  5. 【Android】Bitmap加载图片错误 java.lang.OutOfMemoryError: bitmap size exceeds VM budget

    今天测试程序的时候出现下面的错误日志信息,程序当场挂掉 07-09 14:11:25.434: W/System.err(4890): java.lang.OutOfMemoryError: bitm ...

  6. Android bitmap图片处理

    一.View转换为Bitmap         在Android中所有的控件都是View的直接子类或者间接子类,通过它们可以组成丰富的UI界面.在窗口显示的时候Android会把这些控件都加载到内存中 ...

  7. Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】

    package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...

  8. Android,View转换bitmap,bitmap转换drawable

    Android View转换Bitmap,Bitmap转换Drawable //测试设置bitmap View view1 = ViewGroup.inflate(context, R.layout. ...

  9. 【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)

    一.背景 最近想把一些Android Demo的运行效果图获取下来,但是一直使用真机进行调试,在电脑上不好截取一段gif动画.而之前使用模拟器的时候可以使用 GifCam 工具进行屏幕动画截取.Gif ...

随机推荐

  1. 从零开始山寨Caffe·零:必先利其器

    工作环境 巧妇有了米炊 众所周知,Caffe是在Linux下写的,所以长久以来,大家都认为跑Caffe,先装Linux. niuzhiheng大神发起了caffe-windows项目(解决了一些编译. ...

  2. 【水】基于ege的2048

    不要问我ege怎么装 http://tieba.baidu.com/p/2227018541 好,现在我们装好了ege 开始写2048吧 没有算法,单纯模拟,不用讲解——这才叫[水]的含义 界面极度简 ...

  3. 【JAVA】FOR UPDATE 和 FOR UPDATE NOWAIT 区别 (转)

    1.for update 和 for update nowait 的区别:首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限 ...

  4. 25 Killer Actions to Boost Your Self-Confidence

    25 Killer Actions to Boost Your Self-Confidence Once we believe in ourselves, we can risk curiosity, ...

  5. 深入分析Java ClassLoader原理

    一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程 ...

  6. ZeroMQ接口函数之 :zmq_msg_recv - 从一个socket中接受一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv zmq_msg_recv(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  7. Daily Scrum02 12.08

    编译大作业的第一次检查终于过去了,已经经过这次检查的组员们可以暂时松一口气了. 也希望编译大作业有着落的成员可以多花一些时间在团队任务上,帮其他的组员多分担一些工作. 第一次没来的及检查的同学,或是没 ...

  8. javascript 学习之自定义滚动条加滚轮事件

    要自己写一个自定义滚动条加上滚轮事件,之前的没有滚轮事件不完整,今天整理了一个. 1.滚轮事件是不兼容的,firefox中是必需要用事件绑定的添加,用的DOMMouseScroll,当滚动鼠标的时候, ...

  9. 标签案例-开发foreach标签

    if(item.getClass().isArray()){ this.collection = new ArrayList(); int length = Array.getLength(items ...

  10. SQL Server 2008 R2数据库镜像部署

    概述 “数据库镜像”是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server数据库实例中.建议使用不同位置的两台服务器来承载.在 ...