很多时候我们从网络上获取图片,但有时图片路径明明正确,却要出错。图片小无所谓,图片大了就出错了。
ImageView imageView = new ImageView(context);
URL url = new URL("图片路径");
URLConnection conn = url.openConnection();
        t();
        InputStream is = InputStream();
        BitmapFactory.Options options=new BitmapFactory.Options();
            options.inSampleSize = 10;
originalImage = BitmapFactory.decodeStream(is,null,options);
imageView.setImageBitmap(bitmapWithReflection);
这样问题就可以解决了
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在使用的过程中,如果网络比较慢的话,则会出现下载不成功的问题。经过google搜索,终于解决了这个问题。
  一般我们会用以下的代码:
java代码:
//获取connection,方法略
conn = getURLConnection(url);
is = InputStream();
//获取Bitmap的引用
Bitmap bitmap = BitmapFactory.decodeStream(is)
      但是网络不好的时候获取不了图片,推荐使用以下的方法:
java代码:
//获取长度
int length = (int) ContentLength();
if (length != -1) {
byte[] imgData = new byte[length];
byte[] temp=new byte[512];
int readLen=0;
int destPos=0;
while((ad(temp))>0){
System.arraycopy(temp, 0, imgData, destPos, readLen);
destPos+=readLen;
}
bitmap=BitmapFactory.decodeByteArray(imgData, 0, imgData.length);
}
        使用上面的方法的好处是在网速不好的情况下也会将图片数据全部下载,然后在进行解码,生成图片对象的引用,所以可以保证只要图片存在都可以下载下来。当然在读取图片数据的时候也可用java.nio.ByteBuffer,这样在读取数据前就不用知道图片数据的长度也就是图片的大小了,避免了有时候 http获取的length不准确,并且不用做数组的copy工作。
java代码:
public synchronized Bitmap getBitMap(Context c, String url) {
URL myFileUrl = null;
Bitmap bitmap = null;
try {
myFileUrl = new URL(url);
} catch (MalformedURLException e) {
bitmap = BitmapFactory.Resources(),
ko.R.drawable.defaultimg);
connect下载return bitmap;
}
try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setDoInput(true);
t();
InputStream is = InputStream();
int length = (int) ContentLength();
if (length != -1) {
byte[] imgData = new byte[length];
byte[] temp = new byte[512];
int readLen = 0;
int destPos = 0;
while ((readLen = is.read(temp)) > 0) {
System.arraycopy(temp, 0, imgData, destPos, readLen);
destPos += readLen;
}
bitmap = BitmapFactory.decodeByteArray(imgData, 0,imgData.length);
}
} catch (IOException e) {
bitmap = BitmapFactory.Resources(),ko.R.drawable.defaultimg);
return bitmap;
}
return bitmap;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
从网络获取图片,数据为InputStream流对象,然后调用BitmapFactory的decodeStream()
方法解码获取图片。代码如下:
private Bitmap getUrlBitmap(String url)
{
Bitmap bm;
try{
URL imageUrl=new URL(url);
HttpURLConnection conn=(HttpURLConnection)imageUrl.openConnection();
t();
InputStream InputStream();
//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 = ByteArray();
return bytes;
}
private void queuePhoto(String url, Activity activity, ImageView imageView)
002        {
003            // This ImageView may be used for other images before. So there may be
004            // some old tasks in the queue. We need to discard them.
005   
006            photosQueue.Clean(imageView);
007            PhotoToLoad p = new PhotoToLoad(url, imageView);
008   
009            synchronized (photosQueue.photosToLoad)
010            {
011                photosQueue.photosToLoad.push(p);
012                ifyAll();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。