`

android中使用BitmapFactory的decodeStream()方法解码图片失败问题

阅读更多

从网络获取图片,数据为InputStream流对象,然后调用BitmapFactory的decodeStream()方法解码获取图片。代码如下:

 
private Bitmap getUrlBitmap(String url) { Bitmap bm; try { URL imageUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); // byte[] bt=getBytes(is); // 注释部分换用另外一种方式解码 // bm=BitmapFactory.decodeByteArray(bt,0,bt.length); bm = BitmapFactory.decodeStream(is); // 如果采用这种解码方式在低版本的API上会出现解码问题 is.close(); conn.disconnect(); return bm; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null ; }

结果在运行时编译器提示:           DEBUG / skia (xxx ):   ---   decoder -> decode returned  false  

已经确定从网络获取的数据流没有出现问题,而是在图片解码时出现错误。上网查找了不少资料,也没有得出确切的原因,不过有几条意见值得关注。

一种说法是在android 较低版本的api中会有不少内部的错误,我的代码运行时选择2.1API Level 7和2.2API Level 8都会出现这个问题,而选择2.3 API Level 9后能够正常解码图片。

我的另外一种做法是换用别的解码方式对图片解码,见代码中被注释的那俩行,使用decodeByteArray()方法在低版本的API上也能够正常解码,解决了这个问题。

其中getBytes(InputStream is)是将InputStream对象转换为Byte[]的方法,具体代码如下:

private byte [] getBytes(InputStream is) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte [] b = new byte [ 1024 ]; int len = 0 ; while ((len = is.read(b, 0 , 1024 )) != - 1 ) { baos.write(b, 0 , len); baos.flush(); } byte [] bytes = baos.toByteArray(); return bytes; }

分享到:
评论

相关推荐

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

    Android 中加载大图片时内存溢出的...可以使用 BitmapFactory.Options、recycle() 方法、Java 中的内存优化技术、Android 中的内存优化技术、JNI 技术、避免使用大图片和缓存技术来减少内存的消耗,从而避免内存溢出。

    Android如何从服务器获取图片

    Android如何从服务器获取图片是Android开发中常见的问题,本文将详细介绍如何使用Android从服务器获取图片并将其显示在手机上。 获取图片的步骤 1. 创建HttpGet对象:使用HttpGet对象来请求服务器中的图片资源。 2...

    BitmapFactory

    BitmapFactory是Android系统中用于处理图像资源的核心类,它提供了将图像数据解码为Bitmap对象的方法。简单工厂模式是一种设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。在这个场景中,...

    063集-BitmapFactory

    BitmapFactory是Android系统中用于处理图像资源的核心类,它提供了将图像数据转化为Bitmap对象的方法,同时也支持从多种来源加载和解码图片。在Android开发中,理解和熟练运用BitmapFactory是优化应用性能、节省内存...

    Android图片缓存之Bitmap详解(一)

    - `decodeStream(InputStream is, OutPointf outPadding, Options options)` 是一个常用的解码方法,`OutPointf`用于获取解码后图像相对于原始图像的位置变化,`Options`参数提供了多种解码选项。 7. **...

    Android有效解决图片问题

    在Android开发中,处理图片加载是一项...通过以上方法,开发者可以有效地处理Android应用中的大图片加载,避免内存溢出问题,提高应用的稳定性和性能。在实际开发中,应结合项目需求和资源条件,选择最适合的解决方案。

    android 获取网络图片

    一旦获取到数据流,可以使用`BitmapFactory`的`decodeStream()`方法来解码图片。以下是一个基本示例: ```java URL url = new URL("网络图片的URL"); HttpURLConnection connection = (HttpURLConnection) url.open...

    Android解决图片OOM问题

    在加载图片时,使用`BitmapFactory.decodeStream()`方法而不是直接从资源文件或网络加载,这样可以控制图片解码的大小,避免一次性加载整个图片。 **3. LruCache与内存缓存** Android提供了一个名为`LruCache`的...

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

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

    从android自带图片应用中选择图片

    本文将深入探讨如何在Android应用中实现从系统自带的图片应用中选择图片的功能,这涉及到权限管理、Intent的使用以及图片处理等多个知识点。 首先,我们需要在AndroidManifest.xml文件中添加读取存储权限,这是访问...

    Android图片处理源码

    BitmapFactory类提供了多种解码选项,如 decodeStream() 和 decodeResource() 方法,可以通过配置inSampleSize来降低图片的分辨率,从而减少内存占用。同时,也可以使用Bitmap的compress()方法将图片压缩为特定格式...

    android圆形图片裁剪.zip

    然后使用`ContentResolver`和`BitmapFactory`来解码图片: ```java Uri selectedImage = data.getData(); InputStream imageStream = getContentResolver().openInputStream(selectedImage); Bitmap bitmap = ...

    android获取图片的四种方式

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

    Android程序从网络上获取一张图片【代码】

    使用`BitmapFactory.decodeStream()`方法可以将输入流转换为Bitmap对象,这是Android系统中表示图片的基本类型。 5. **内存管理**: 图片数据可能会占用大量内存,因此在处理Bitmap时需要考虑内存管理。可以使用`...

    BitMapFactoryOption

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

    Android中图片处理(压缩 显示 保存)

    该方法首先检查`Uri`是否有效,然后通过`ContentResolver`获取图片数据,并使用`BitmapFactory.decodeStream()`方法解码成`Bitmap`对象,最后将其显示在`ImageView`上。 ### 图片保存 保存图片涉及将`Bitmap`对象...

    android上传图片源码

    可以使用像Glide或Picasso这样的库来加载和处理图片,或者使用BitmapFactory.decodeStream() 解码图片,再通过Bitmap.createScaledBitmap() 进行尺寸调整。 3. **文件读写**:在上传前,图片可能需要先保存到本地,...

    android异步下载图片

    3. **图片解码**:将字节数据解码成Bitmap对象,可以使用BitmapFactory类的decodeStream()方法。 4. **显示图片**:将Bitmap设置到ImageView中,使用setImageBitmap()方法。 5. **处理线程**:在整个过程中,确保...

    Android获取图片的RGB值

    1. 使用` BitmapFactory `类的` decodeResource() `或` decodeStream() `方法从资源文件或输入流中解码图片,得到Bitmap对象。 2. 或者使用第三方库如Glide、Picasso等进行图片加载和缓存管理,它们提供了更方便的...

    android从相册加载图片

    在实际开发中,你可能还需要考虑其他因素,如异步操作以避免阻塞UI线程,使用 Glide 或 Picasso 图片加载库来简化流程,以及处理不同设备和Android版本的兼容性问题。 综上所述,从Android相册加载图片并保存到另一...

Global site tag (gtag.js) - Google Analytics