从网上获取图片并显示比较容易,只需要通过http获取输入流,然后解码输入流即可,但是有些图片还是比较大,在解码显示之前需要压缩,
压缩方式都一样,计算设置采样率大小即可;
但是在获取图片宽高的时候会先读取一次图片数据,采用流的话这次已经把数据读走了,所以在后面再真正解码图片的时候始终是null;
解决办法就是将输入流转为字节数组保存下来,对这个数组进行操作,问题得到解决,模块代码如下:
public static Bitmap decodeNetWork(String fileUrl, int width, int height) { if(fileUrl == null || !fileUrl.startsWith(Constant.HTTP_TAG)) return null; URL url = null; try { url = new URL(fileUrl); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } HttpURLConnection conn = null; InputStream inputStream = null; Bitmap bm1 = null; try { conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.connect(); inputStream = conn.getInputStream(); final BitmapFactory.Options options = new BitmapFactory.Options(); /*只加载基础信息,并不真正解码图片*/ options.inJustDecodeBounds = true; byte[] data = MyFileUtils.getBytes(inputStream); bm1 = BitmapFactory.decodeByteArray(data, 0, data.length, options); if (options.outWidth < 1 || options.outHeight < 1) { return null; } int[] size = calculateSize(options.outWidth, options.outHeight, width, height); /*计算缩放率*/ options.inSampleSize = getSampleSize(options, size[0], size[1]); options.inPreferredConfig = Bitmap.Config.RGB_565; options.inPurgeable = true; options.inInputShareable = true; options.inJustDecodeBounds = false; bm1 = BitmapFactory.decodeByteArray(data, 0, data.length, options); conn.disconnect(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (OutOfMemoryError e) { } try { if(inputStream != null) inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bm1; }
原文:http://blog.csdn.net/fireworkburn/article/details/19120443