`
endual
  • 浏览: 3567282 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法

 
阅读更多

 

关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法

分类: Android开发技术 2237人阅读 评论 (3) 收藏 举报
[java] view plain copy
  1.   

在android sdk 1.6版本API帮助文档中,其中关于BitmapFactory.decodeFactory.decodeStream(InputStream is)的帮助文档是这么说明的:

[html] view plain copy
  1.    
  2. Bitmap android.graphics.BitmapFactory.decodeStream(InputStream is)  
  3.   
  4. public static Bitmap decodeStream (InputStream is)   
  5. Since: API Level 1   
  6. Decode an input stream into a bitmap. < strong > If the input stream is null, or cannot be used to decode a bitmap, the function returns null </ strong > . The stream's position will be where ever it was after the encoded data was read.  
  7.   
  8. Parameters  
  9. is  The input stream that holds the raw data to be decoded into a bitmap.   
  10.   
  11. Returns  
  12. The decoded bitmap, or null if the image data could not be decoded.   

 

注意黑体字。以下是具体代码:

 

[java] view plain copy
  1. public   static  Bitmap bmpFromURL(URL imageURL){  
  2.   
  3.     Bitmap result = null ;  
  4.   
  5.     try  {  
  6.   
  7.         HttpURLConnection connection = (HttpURLConnection)imageURL .openConnection();  
  8.   
  9.         connection.setDoInput(true );  
  10.   
  11.         connection.connect();  
  12.   
  13.         InputStream input = connection.getInputStream();  
  14.   
  15.         result = BitmapFactory.decodeStream(input);  
  16.   
  17.   
  18.     } catch  (IOException e) {  
  19.   
  20.   
  21.         e.printStackTrace();  
  22.   
  23.     }  
  24.   
  25.     return  result;  
  26.   
  27. }  

后来调试发现,result为null,加之查看帮助文档中的黑体字,
所以在所获得的InputStream不为空的情况下,调用BitmapFactory.decodeStream(is)方法,他也有可能无法解码成 bitmap,刚开始我怀疑是本身图片地址有问题,或图片自身格式不正确,但通过浏览器查看,图片显示正常,而且,我是保存了几十张图片,但每次都会有个 别几张图片无法正常显示,需要重复下载三四次,才可能保存成功。

后来在一篇文章中才发现,原来这是android 1.6版本的一个bug!

 

有牛人提出的一个解决办法,我试了试,问题解决了

首先在原方法中改一句:

[java] view plain copy
  1. result = BitmapFactory.decodeStream( new  PatchInputStream(input));  


再创建一个类:

 

[java] view plain copy
  1. public   class  PatchInputStream  extends  FilterInputStream{  
  2.   
  3.         protected  PatchInputStream(InputStream in) {  
  4.             super (in);  
  5.             // TODO Auto-generated constructor stub   
  6.         }  
  7.           
  8.         public   long  skip( long  n) throws  IOException{  
  9.             long  m=0l;  
  10.             while (m<n){  
  11.                 long  _m=in.skip(n-m);  
  12.                 if (_m==0l){  
  13.                     break ;  
  14.                 }  
  15.                 m+=_m;  
  16.             }  
  17.             return  m;  
  18.         }  
  19.           
  20.     }  

 

 

第二种方法:最终用的是这种方法

[java] view plain copy
  1. InputStream is = httpConn.getInputStream();  
[java] view plain copy
  1. if  (is ==  null ){  
  2.     throw   new  RuntimeException( "stream is null" );  
  3. }else {  
  4.     try  {  
  5.         byte [] data=readStream(is);  
  6.         if (data!= null ){  
  7.             bitmap = BitmapFactory.decodeByteArray(data, 0 , data.length);  
  8.         }  
  9.     } catch  (Exception e) {  
  10.         e.printStackTrace();  
  11.     }  
  12.       
  13.     is.close();  
  14. }  


 

[java] view plain copy
  1. /*  
  2.      * 得到图片字节流 数组大小  
  3.      * */   
  4.     public   static   byte [] readStream(InputStream inStream)  throws  Exception{        
  5.         ByteArrayOutputStream outStream = new  ByteArrayOutputStream();        
  6.         byte [] buffer =  new   byte [ 1024 ];        
  7.         int  len =  0 ;        
  8.         while ( (len=inStream.read(buffer)) != - 1 ){        
  9.             outStream.write(buffer, 0 , len);        
  10.         }        
  11.         outStream.close();        
  12.         inStream.close();        
  13.         return  outStream.toByteArray();        
  14.     } 
分享到:
评论
1 楼 endual 2012-08-12  
第二种种方式解决的问题的

相关推荐

    android有效解决图片过大内存溢出的问题

    2. **图片解码过程消耗内存**:默认情况下,Android使用Java层的`createBitmap`方法解码图片,这个过程会消耗额外的内存。 3. **未正确释放Bitmap对象**:当不再使用Bitmap对象时,如果没有正确地释放内存,会导致...

    android获取图片的四种方式

    `getResources().getAssets().open()`方法用于打开Assets目录中的文件,返回一个输入流,然后通过`BitmapFactory.decodeStream()`解码成Bitmap。 每种方法都有其适用场景,开发者应根据实际需求选择最合适的方式。...

    Android有效解决图片问题

    - `setImageBitmap`、`setImageResource`和`BitmapFactory.decodeResource`在解码图片后会直接在Java层创建Bitmap对象,消耗大量内存。 - `BitmapFactory.decodeStream`通过JNI调用`nativeDecodeAsset()`直接解码...

    将Bitmap转成byte[]小例子

    当需要从byte数组还原Bitmap时,我们需要先创建一个 ByteArrayInputStream,然后使用BitmapFactory的decodeStream()方法来解码输入流,生成Bitmap对象。以下是如何实现的示例: ```java public static Bitmap ...

    详解android 通过uri获取bitmap图片并压缩

    在上面的代码中,我们首先通过 BitmapFactory.Options 对象来获取图片的原始宽度和高度,然后计算缩放比,最后使用 BitmapFactory.decodeStream() 方法来解码图片。这样可以避免OOM,并且可以获取到压缩后的bitmap...

    Android bitmap

    调用`decodeStream()`方法解码网络流为Bitmap: ```java String icoURI = "http://202.140.96.134:8080/FS-RSS/img/RN.png"; URL imgURL = new URL(icoURI); URLConnection conn = imgURL.openConnection(); ...

    bitmap内存问题

    Bitmap btp = BitmapFactory.decodeStream(is, null, options); ``` 这里设置`inSampleSize`为10,意味着加载的图片宽度和高度将只有原始图片的十分之一。这样可以在一定程度上减轻内存负担。 ### 2. 显式释放...

    android bitmap图片压缩

    为了降低内存占用,我们可以使用BitmapFactory.decodeStream()或BitmapFactory.decodeResource()等方法解析图片时,传入BitmapFactory.Options对象,并设置其inSampleSize属性。inSampleSize表示图像解码时的采样率...

    Android读取本地或网络图片并转换为Bitmap

    使用`BitmapFactory.decodeFile()`方法可以从文件路径直接解码为Bitmap对象: ```java Bitmap bitmap = BitmapFactory.decodeFile(localImagePath); ``` ### 2. 读取网络图片并转换为Bitmap 从网络读取图片并转换...

    android图片缩放

    4. **设置`inJustDecodeBounds`为`false`并重新解码图片**:设置`inJustDecodeBounds`为`false`后,再次调用`BitmapFactory.decodeFile()`或`BitmapFactory.decodeStream()`等方法,此时返回的就是缩放后的`Bitmap`...

    Android图像介绍-Bitmap常用操作

    此外,我们还可以通过从资源文件或者InputStream创建Bitmap,例如` BitmapFactory.decodeResource(Resources res, int id)`或`BitmapFactory.decodeStream(InputStream is)`。 解码Bitmap是非常关键的步骤,因为它...

    Android有效解决加载大图片时内存溢出的问题

    Bitmap btp = BitmapFactory.decodeStream(is, null, options); ``` 二、使用 recycle() 方法 在加载大图片时,使用 recycle() 方法可以释放图片占用的内存空间,从而避免内存溢出。例如: ```java if (!bmp.is...

    Android如何从服务器获取图片

    5. 解码图片流:使用BitmapFactory对象将图片流解码为Bitmap对象。 6. 显示图片:使用ImageView对象将Bitmap对象显示在手机上。 关键代码 ```java public static Bitmap getBitmapFromServer(String imagePath) { ...

    Android应用源码之(Bitmap位图渲染与操作).zip

    - **内存缓存**:使用LruCache或其他缓存策略,避免频繁加载和解码Bitmap导致内存消耗过大。 - **SampleSize**:通过设置`inSampleSize`减少解码时的图片大小,降低内存占用。 - **BitmapFactory.Options**:利用...

    安卓Android源码——(Bitmap位图渲染与操作).rar

    Bitmap可以通过多种方式创建,如` BitmapFactory.decodeResource()`从资源文件中解码,` BitmapFactory.decodeFile()`从文件系统中读取,或者` BitmapFactory.decodeStream()`从输入流中解码。这些方法会根据指定的...

    BitMapFactoryOption

    4. 使用BitmapFactory.decodeStream或decodeResource等方法解码图片,传入计算好的Sample Size。 5. 处理解码后的Bitmap对象,如设置给ImageView或者进行其他图像处理。 通过深入理解BitmapFactoryOption及其相关...

    bitmap理解学习例子

    例如,`BitmapFactory.decodeResource()`、`BitmapFactory.decodeFile()` 和 `BitmapFactory.decodeStream()` 分别用于从资源、文件和流中加载Bitmap。 - **尺寸调整**:`Bitmap.createScaledBitmap()` 方法可用于...

    Bitmap(3)-android中操作Bitmap

    例如,从资源id创建(`BitmapFactory.decodeResource()`)、从文件路径创建(`BitmapFactory.decodeFile()`)或从二进制流创建(`BitmapFactory.decodeStream()`)。这些方法通常会根据需求进行解码,以避免一次性...

    Android开发者学习笔记——View、Canvas、bitmap

    或者,使用 BitmapFactory 获取位图,通过 BitmapFactory 的 decodeStream() 函数解码位图资源,获取位图:`Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.pic180);` 获取位图的信息 获取位图信息...

    Android Bitmap网络图片下载

    - `BitmapFactory.decodeStream()`方法可以从输入流中解析出Bitmap对象,这是从网络下载图片后解码的关键步骤。 - `BitmapFactory.Options`可以设置解码时的参数,如缩放比例、格式、质量等,以控制内存消耗。 3....

Global site tag (gtag.js) - Google Analytics