从网络获取图片,数据为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 中加载大图片时内存溢出的...可以使用 BitmapFactory.Options、recycle() 方法、Java 中的内存优化技术、Android 中的内存优化技术、JNI 技术、避免使用大图片和缓存技术来减少内存的消耗,从而避免内存溢出。
Android如何从服务器获取图片是Android开发中常见的问题,本文将详细介绍如何使用Android从服务器获取图片并将其显示在手机上。 获取图片的步骤 1. 创建HttpGet对象:使用HttpGet对象来请求服务器中的图片资源。 2...
BitmapFactory是Android系统中用于处理图像资源的核心类,它提供了将图像数据解码为Bitmap对象的方法。简单工厂模式是一种设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。在这个场景中,...
BitmapFactory是Android系统中用于处理图像资源的核心类,它提供了将图像数据转化为Bitmap对象的方法,同时也支持从多种来源加载和解码图片。在Android开发中,理解和熟练运用BitmapFactory是优化应用性能、节省内存...
- `decodeStream(InputStream is, OutPointf outPadding, Options options)` 是一个常用的解码方法,`OutPointf`用于获取解码后图像相对于原始图像的位置变化,`Options`参数提供了多种解码选项。 7. **...
在Android开发中,处理图片加载是一项...通过以上方法,开发者可以有效地处理Android应用中的大图片加载,避免内存溢出问题,提高应用的稳定性和性能。在实际开发中,应结合项目需求和资源条件,选择最适合的解决方案。
一旦获取到数据流,可以使用`BitmapFactory`的`decodeStream()`方法来解码图片。以下是一个基本示例: ```java URL url = new URL("网络图片的URL"); HttpURLConnection connection = (HttpURLConnection) url.open...
在加载图片时,使用`BitmapFactory.decodeStream()`方法而不是直接从资源文件或网络加载,这样可以控制图片解码的大小,避免一次性加载整个图片。 **3. LruCache与内存缓存** Android提供了一个名为`LruCache`的...
2. **图片解码过程消耗内存**:默认情况下,Android使用Java层的`createBitmap`方法解码图片,这个过程会消耗额外的内存。 3. **未正确释放Bitmap对象**:当不再使用Bitmap对象时,如果没有正确地释放内存,会导致...
本文将深入探讨如何在Android应用中实现从系统自带的图片应用中选择图片的功能,这涉及到权限管理、Intent的使用以及图片处理等多个知识点。 首先,我们需要在AndroidManifest.xml文件中添加读取存储权限,这是访问...
BitmapFactory类提供了多种解码选项,如 decodeStream() 和 decodeResource() 方法,可以通过配置inSampleSize来降低图片的分辨率,从而减少内存占用。同时,也可以使用Bitmap的compress()方法将图片压缩为特定格式...
然后使用`ContentResolver`和`BitmapFactory`来解码图片: ```java Uri selectedImage = data.getData(); InputStream imageStream = getContentResolver().openInputStream(selectedImage); Bitmap bitmap = ...
`getResources().getAssets().open()`方法用于打开Assets目录中的文件,返回一个输入流,然后通过`BitmapFactory.decodeStream()`解码成Bitmap。 每种方法都有其适用场景,开发者应根据实际需求选择最合适的方式。...
使用`BitmapFactory.decodeStream()`方法可以将输入流转换为Bitmap对象,这是Android系统中表示图片的基本类型。 5. **内存管理**: 图片数据可能会占用大量内存,因此在处理Bitmap时需要考虑内存管理。可以使用`...
4. 使用BitmapFactory.decodeStream或decodeResource等方法解码图片,传入计算好的Sample Size。 5. 处理解码后的Bitmap对象,如设置给ImageView或者进行其他图像处理。 通过深入理解BitmapFactoryOption及其相关...
该方法首先检查`Uri`是否有效,然后通过`ContentResolver`获取图片数据,并使用`BitmapFactory.decodeStream()`方法解码成`Bitmap`对象,最后将其显示在`ImageView`上。 ### 图片保存 保存图片涉及将`Bitmap`对象...
可以使用像Glide或Picasso这样的库来加载和处理图片,或者使用BitmapFactory.decodeStream() 解码图片,再通过Bitmap.createScaledBitmap() 进行尺寸调整。 3. **文件读写**:在上传前,图片可能需要先保存到本地,...
3. **图片解码**:将字节数据解码成Bitmap对象,可以使用BitmapFactory类的decodeStream()方法。 4. **显示图片**:将Bitmap设置到ImageView中,使用setImageBitmap()方法。 5. **处理线程**:在整个过程中,确保...
1. 使用` BitmapFactory `类的` decodeResource() `或` decodeStream() `方法从资源文件或输入流中解码图片,得到Bitmap对象。 2. 或者使用第三方库如Glide、Picasso等进行图片加载和缓存管理,它们提供了更方便的...
在实际开发中,你可能还需要考虑其他因素,如异步操作以避免阻塞UI线程,使用 Glide 或 Picasso 图片加载库来简化流程,以及处理不同设备和Android版本的兼容性问题。 综上所述,从Android相册加载图片并保存到另一...