2011-03-30 50 views
1

我试图从web下载一个jpg图像并将其保存到一个字节数组中,以便在RAM上获得压缩图像,直到我必须显示它,但我得到一个黑色的图片。从网络上下载一个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(); 

我通过这样做,我解码JPEG,然后做

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解决了这个问题重新编码图像多次降低图片的质量并使用超过必要的电话资源。此外,重新编码后得到的位图比原始jpg图像大。

有没有办法让第一种方法工作?

谢谢。

回答

0

您是否试图简单地将InputStream的内容复制到字节数组中?

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

编辑 - 你不需要处理数组初始化,如果你使用Apache Commons方法:

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

toByteArray使用ByteArrayOutputStream避免分配数组的前期,但你止跌”不用担心这一点。

+0

是的,我知道这是一个noob问题。问题是我不知道如何初始化字节数组。应该多久?有没有可能你有Apache公用(IOUtils)的例子? – 2011-03-30 16:18:08

+0

坦克你。这个应用程序在用于丢弃memoryOutOfBoundsException之前(当我保存Bitmaps的图像时),不,我可以将它们保存为jpg(或jpg类)并保持质量。 – 2011-03-31 05:57:19

+0

我找不到IOUtils。你可以说它包括哪些包? Niether我在org.apache.commons中有io,这就是为什么我无法访问org.apache.commons.io.IOUtils。 “ – Debopam 2012-07-29 07:46:48

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

”位图应该在未使用时回收,我认为您不能从该位置调用bitmapFromByteArray.recycle();“。你是对的我不知道为什么我在这里死记硬背。我的应用没有这种功能。 – 2011-03-30 16:15:04

相关问题