从Web下载jpg图像,将其保存到RAM上的字节数组中

时间:2011-03-30 15:21:54

标签: android

我正在尝试从网上下载jpg图像,将其保存为字节数组,以便将压缩图像放在ram上,直到我必须显示它,但我得到一张黑色图片。

我正在做的是:

URL myFileUrl =null; 

myFileUrl= new URL(fileUrl);

HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
conn.setUseCaches(false);

InputStream is = conn.getInputStream();

byte[] ba = new byte[is.available()];

之后我将数组保留在RAM中,直到我必须使用它。

要放置它,我这样做:

Bitmap bitmapFromByteArray = BitmapFactory.decodeByteArray(ba,0,ba.length);

imageView1.setImageBitmap(bitmapFromByteArray);

bitmapFromByteArray.recycle();

我通过

解决了这个问题
URL myFileUrl =null; 

myFileUrl= new URL(fileUrl);

HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();

InputStream is = conn.getInputStream();

Bitmap bm = BitmapFactory.decodeStream(is);

int size = bm.getWidth() * bm.getHeight();

ByteArrayOutputStream out = new ByteArrayOutputStream(size);
bm.compress(Bitmap.CompressFormat.JPEG, 100, out);

byte[] ba2 = out.toByteArray();
bm.recycle()

Buut通过这样做,我正在解码JPEG,然后多次重新编码图像,降低了图片的质量,并使用超过必要的电话资源。此外,重新编码后得到的位图大于原始的jpg图像。

有没有办法让第一种方法起作用?

谢谢。

2 个答案:

答案 0 :(得分:0)

您是否只想将InputStream的内容复制到字节数组中?

您可以使用将InputStream#read调用到字节数组中的循环直接执行此操作,也可以使用Apache commons中的IOUtils.toByteArray将实现保留给其他人。

编辑 - 如果使用Apache commons方法,则无需处理数组初始化:

byte[] bytes = null;
try {
    bytes = IOUtils.toByteArray(conn.getInputStream());
} catch (IOException e) {
    // handle the exception
}

toByteArray使用ByteArrayOutputStream来避免预先分配数组,但您不必担心这一点。

答案 1 :(得分:0)

  1. byte[] ba = new byte[is.available()];这不是你得到所需字节的方式。获取该字节的最简单方法是使用Apache commons(IOUtils)。您的第二种方法直接从HTTP输入流解码位图。这也是可能的,但最好先下载并解码。此外,您无需在解码后压缩位图。只需使用它。
  2. 不使用时,应该回收位图。我不认为你可以从那个地方拨打bitmapFromByteArray.recycle();